MySQL整数字段在PHP中作为string返回

嗨,大家好我有一个MySQL数据库中的表字段:

userid INT(11) 

所以我打电话给我的网页与此查询:

 "SELECT userid FROM DB WHERE name='john'" 

然后为了处理结果我做:

 $row=$result->fetch_assoc(); $id=$row['userid']; 

现在如果我这样做:

 echo gettype($id); 

我得到一个string。 这不应该是一个整数?

谢谢

卢卡

当您使用PHP从MySQL数据库中select数据时,数据types将始终转换为string。 您可以使用以下代码将其转换回整数:

 $id = (int) $row['userid']; 

或者使用函数intval()

 $id = intval($row['userid']); 

使用mysqlnd(native driver)for php。 如果你在Ubuntu上:

 sudo apt-get install php5-mysqlnd sudo service apache2 restart 

本地驱动程序适当地返回整数types。

编辑:

正如@Jeroen所指出的,这个方法只适用于PDO(不是mysqli)。

我的解决scheme是传递查询结果$rs并得到铸造数据的关联数组作为返回:

 function cast_query_results($rs) { $fields = mysqli_fetch_fields($rs); $data = array(); $types = array(); foreach($fields as $field) { switch($field->type) { case 3: $types[$field->name] = 'int'; break; case 4: $types[$field->name] = 'float'; break; default: $types[$field->name] = 'string'; break; } } while($row=mysqli_fetch_assoc($rs)) array_push($data,$row); for($i=0;$i<count($data);$i++) { foreach($types as $name => $type) { settype($data[$i][$name], $type); } } return $data; } 

用法示例:

 $dbconn = mysqli_connect('localhost','user','passwd','tablename'); $rs = mysqli_query($dbconn, "SELECT * FROM Matches"); $matches = cast_query_results($rs); // $matches is now a assoc array of rows properly casted to ints/floats/strings 

不pipe在表中定义的数据types如何,PHP的MySQL驱动程序总是以行的forms提供行值。

你需要把你的ID转换成一个int。

 $row = $result->fetch_assoc(); $id = (int) $row['userid']; 

我喜欢乍得的答案,尤其是当查询结果将被传递到浏览器中的JavaScript。 Javascript像数字一样干净地处理数字,但需要额外的工作来处理像数字一样的string。 即必须对它们使用parseInt或parseFloat。

build立在乍得的解决scheme我使用这个,它通常正是我所需要的,并创build可以JSON编码的结构,以便于在JavaScript中处理。

 while ($row = $result->fetch_assoc()) { // convert numeric looking things to numbers for javascript foreach ($row as &$val) { if (is_numeric($val)) $val = $val + 0; } } 

将数字string添加到0会在PHP中产生一个数字types,并正确标识该types,因此浮点数不会被截断为整数。

最简单的解决scheme我发现:

你可以强制json_encode使用实际的数字来表示看起来像数字的值:

 json_encode($data, JSON_NUMERIC_CHECK) 

(自PHP 5.3.3起)。

或者你可以把你的ID转换成int。

 $row = $result->fetch_assoc(); $id = (int) $row['userid']; 

你可以这样做…

  1. 的mysql_fetch_field()
  2. mysqli_result :: fetch_field_direct或
  3. PDOStatement对象:: getColumnMeta()

取决于你想要使用的扩展名。 第一个不推荐,因为mysql扩展已被弃用。 第三个仍然是实验性的。

这些超链接的评论做了一个很好的解释如何将您的types从一个普通的旧string设置为其在数据库中的原始types。

一些框架也抽象(CodeIgniter提供$this->db->field_data() )。

你也可以做猜测 – 就像遍历你的结果行,并使用is_numeric() 。 就像是:

 foreach($result as &$row){ foreach($row as &$value){ if(is_numeric($value)){ $value = (int) $value; } } } 

这将把任何看起来像数字的东西变成一个…绝对不是完美的。

MySQL具有许多其他语言的驱动程序,将数据转换为string“标准化”数据,并留给用户将值types转换为int或其他

在我的项目中,我通常使用一个外部函数来“过滤”使用mysql_fetch_assoc检索的数据。

您可以重命名表中的字段,以便直观地了解存储哪种数据types。

例如,可以为每个数字字段添加一个特殊的后缀:如果useridINT(11) ,则可以将其重命名为userid_i或者如果它是UNSIGNED INT(11) ,则可以重命名userid_u 。 此时,您可以编写一个简单的PHP函数,接收关联数组(使用mysql_fetch_assoc检索),并将转换应用到与这些特殊“键”一起存储的“值”中。

如果使用了预准备语句,则在适当的情况下,types将为int。 此代码返回一个行数组,其中每行是一个关联数组。 就像如果fetch_assoc()被调用的所有行,但保存types的信息。

 function dbQuery($sql) { global $mysqli; $stmt = $mysqli->prepare($sql); $stmt->execute(); $stmt->store_result(); $meta = $stmt->result_metadata(); $params = array(); $row = array(); while ($field = $meta->fetch_field()) { $params[] = &$row[$field->name]; } call_user_func_array(array($stmt, 'bind_result'), $params); while ($stmt->fetch()) { $tmp = array(); foreach ($row as $key => $val) { $tmp[$key] = $val; } $ret[] = $tmp; } $meta->free(); $stmt->close(); return $ret; } 

在variables之前加一个加号也是可以的,

 $a = "120"; $b = +$a; echo gettype($b); 

显然不是最好的方法,但是当你无法访问环境来安装更好的驱动程序的时候工作。