luc*_*uca 116 php mysql int types gettype
我在MySQL数据库中有一个表字段:
userid INT(11)
Run Code Online (Sandbox Code Playgroud)
所以我用这个查询将它调用到我的页面:
"SELECT userid FROM DB WHERE name='john'"
Run Code Online (Sandbox Code Playgroud)
然后为了处理结果我做:
$row=$result->fetch_assoc();
$id=$row['userid'];
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
echo gettype($id);
Run Code Online (Sandbox Code Playgroud)
我得到一个字符串.这不应该是整数吗?
Mic*_*ter 122
使用PHP从MySQL数据库中选择数据时,数据类型将始终转换为字符串.您可以使用以下代码将其转换回整数:
$id = (int) $row['userid'];Run Code Online (Sandbox Code Playgroud)
或者通过使用功能intval():
$id = intval($row['userid']);Run Code Online (Sandbox Code Playgroud)
adv*_*ait 71
使用mysqlnd(本机驱动程序)for php.
如果你在Ubuntu:
sudo apt-get install php5-mysqlnd
sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)
如果你在Centos上:
sudo yum install php-mysqlnd
sudo service httpd restart
Run Code Online (Sandbox Code Playgroud)
本机驱动程序适当地返回整数类型.
编辑:
正如@Jeroen指出的那样,这种方法只能为PDO开箱即用.
正如@LarsMoelleken所指出的,如果您还将MYSQLI_OPT_INT_AND_FLOAT_NATIVE选项设置为true,则此方法将与mysqli一起使用.
例:
$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, TRUE);
Run Code Online (Sandbox Code Playgroud)
小智 17
我的解决方案是传递查询结果$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;
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
$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
Run Code Online (Sandbox Code Playgroud)
Lar*_*ney 16
最简单的解决方案我发现:
您可以强制json_encode将实际数字用于看起来像数字的值:
json_encode($data, JSON_NUMERIC_CHECK)
Run Code Online (Sandbox Code Playgroud)
(自PHP 5.3.3起).
或者您可以将您的ID转换为int.
$row = $result->fetch_assoc();
$id = (int) $row['userid'];
Run Code Online (Sandbox Code Playgroud)
Bol*_*ock 13
否.无论表中定义的数据类型如何,PHP的MySQL驱动程序始终将行值作为字符串提供.
您需要将您的ID转换为int.
$row = $result->fetch_assoc();
$id = (int) $row['userid'];
Run Code Online (Sandbox Code Playgroud)
小智 5
我喜欢乍得的答案,尤其是当查询结果将传递到浏览器中的javascript时。Javascript干净地处理诸如数字之类的数字实体,但需要额外的工作来处理诸如字符串之类的数字实体。即必须在它们上使用parseInt或parseFloat。
在Chad的解决方案的基础上,我使用了它,这通常正是我所需要的,并创建了可以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;
}
}
Run Code Online (Sandbox Code Playgroud)
将数字字符串添加到0会在PHP中产生一个数字类型,并且可以正确识别该类型,因此浮点数不会被截断为整数。
在连接上PDO::ATTR_EMULATE_PREPARES设置为时会发生这种情况true。
不过要小心,将其设置为false不允许多次使用参数。我相信它也会影响返回的错误消息的质量。
| 归档时间: |
|
| 查看次数: |
102558 次 |
| 最近记录: |