首页 文章

如何使用PDO从MySQL获取数值类型?

提问于
浏览
57

我正在使用PDO和MySQL,出于某种原因,当从数据库获取int类型的值时,PDOStatement返回数字的字符串表示而不是数字类型的值 . 我该如何防止这种情况发生?

我注意到有一个PDO类的属性: PDO::ATTR_STRINGIFY_FETCHES 应该处理这个,但是,当试图修改它时,它会抛出一个错误,说该属性对MySQL驱动程序无效 .

在咨询数据库时获取字符串而不是数字是否正常?

4 回答

  • 26

    我不认为在PHP 5.2中可以完成"numbers" :-(

    在PHP 5.3中,如果我没记错的话,当你使用新的(在PHP> = 5.3中为新的)mysql nd (MySQL Native Driver)驱动程序时,它变得可能 .

    好吧,经过我的书签挖掘后,我发现这篇关于mysqlnd的文章:PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

    它说(引用):

    使用mysqlnd for PDO的优点mysqlnd在使用服务器端Prepared Statements时返回本机数据类型,例如INT列作为整数变量而不是字符串返回 . 这意味着内部数据转换更少 .

    但这只是PHP 5.3(假设您的PHP 5.3版本是使用mysqlnd编译的(而不是旧的libmysql)),并且似乎只是预处理语句的情况:-(

    抱歉...

    一个解决方案就是在PHP端有一个映射系统(比如ORM - 参见Doctrine;只是作为ORM的一个例子:我不要问)要将来自DB的结果转换为PHP数据类型 . ..

    是的,如果您想使用类型敏感的 ===!== 之类的运算符,这是不好的...

  • 2

    要先回答你的上一个问题,“是的”,遗憾的是接收数字作为字符串是正常的 . 正如Pascal引用的手册所述,如果您从PDO关闭准备好的语句仿真,mysqlnd(PHP 5.3)将从预准备语句返回本机数据类型 .

    new PDO($dsn, $user, $pass, array(
        PDO::ATTR_EMULATE_PREPARES => false
    ))
    

    PDO :: ATTR_STRINGIFY_FETCHES与MySQL无关 .

    如果你看一下光明的一面,最好使用准备好的陈述,所以......;)

  • 38

    Pascal's answer是正确的 . 我有点麻烦让它全部工作 . 这是你需要做的 .

    首先,确保安装并激活了mysqlnd . 看看 php --info . 在pdo_mysql部分中,它应该如下所示:

    pdo_mysql
    
    PDO Driver for MySQL => enabled
    Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321
    

    如果不是在客户端API版本中看到 mysqlnd ,而是看到像......这样的行

    Client API version => 5.5.29
    

    ...然后你没有安装和运行mysqlnd . 先照顾好 .

    其次,PDO使用模拟的预处理语句by default for all MySQL连接 . 荒谬,但确实如此 . 只有当您使用真实的预处理语句(在链接的博客文章中称为"server-side prepared statements",现在为here)时,您才会获得本机数据类型 . 所以你必须将PDO :: ATTR_EMULATE_PREPARES设置为false,如下所示:

    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    

    最后,确保没有将PDO :: ATTR_STRINGIFY_FETCHES设置为true .

    $pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
    
  • 61

    您可能安装了 mysqlnd ,但这并不意味着它已准备好供常规 PDO 扩展 (pdo_mysql) 使用,这在共享主机上更常见,因此请确保启用 nd_pdo_mysql 扩展,并禁用其他扩展 pdo_mysql 因为它可能会造成冲突 .

    @screenshot

    enter image description here

    我发现这个(重复)question,决定在这里发表我的想法,希望它好;)

相关问题