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'];
你可以这样做…
- 的mysql_fetch_field()
- mysqli_result :: fetch_field_direct或
- 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。
例如,可以为每个数字字段添加一个特殊的后缀:如果userid
是INT(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);
显然不是最好的方法,但是当你无法访问环境来安装更好的驱动程序的时候工作。