MySQL整数字段在PHP中以字符串形式返回

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)

  • 从Postgres背景来到MySQL后,我觉得有必要说这是一个巨大的痛苦.当你在Postgres中获取一行时,你可以确保行数组中的元素具有适当的数据类型.现在我必须编写代码来手动将每个元素转换为我期望的数据类型. (75认同)
  • 我刚刚在Windows上使用Laravel和Mysql在相同的模式和数据库服务器上进行了一些测试.在Windows上,主键作为Integer返回,而在Linux上则是String. (24认同)
  • 返回的每个字段都是一个字符串 **OR NULL**。 (3认同)

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)

  • 你也可以使用myscli的"MYSQLI_OPT_INT_AND_FLOAT_NATIVE" (7认同)

小智 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)

  • 除了'NULL'之外,很棒的解决方案也是settype()函数使用的变量类型。因此,您的代码将数据库返回的所有NULL值(gettype()=='NULL'的值)更改为带有“值”的“字符串”类型,带有0值的“整数”类型或带有0.0值的“浮点”类型。如果is_null($ data [$ i] [$ name])为true,则无需调用settype。 (2认同)

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)

  • 这将打破所有的邮政编码和电话号码.在您的应用程序中引入Bugs的好方法.解决方案必须尊重mysql列数据类型,而不是尝试从值中猜测. (6认同)
  • 如果可能的话,使用 `json_encode` 将字符串转换为 int 就像使用显微镜来扼杀钉子一样。 (2认同)

Bol*_*ock 13

否.无论表中定义的数据类型如何,PHP的MySQL驱动程序始终将行值作为字符串提供.

您需要将您的ID转换为int.

$row = $result->fetch_assoc();
$id = (int) $row['userid'];
Run Code Online (Sandbox Code Playgroud)

  • 不是PHP(直接)对此行为负责,它是数据库驱动程序.如果您从PHP连接到Postgres数据库,您将获得适当的数据类型. (5认同)

小智 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中产生一个数字类型,并且可以正确识别该类型,因此浮点数不会被截断为整数。


Cha*_*lie 5

在连接上PDO::ATTR_EMULATE_PREPARES设置为时会发生这种情况true

不过要小心,将其设置为false不允许多次使用参数。我相信它也会影响返回的错误消息的质量。