67

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

我注意到 PDO 类有一个属性:PDO::ATTR_STRINGIFY_FETCHES它应该解决这个问题,但是当尝试修改它时,它会抛出一个错误,指出该属性对 MySQL 驱动程序无效。

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

4

4 回答 4

68

首先回答你的最后一个问题,“是的”,不幸的是,接收数字作为字符串是正常的。正如 Pascal 引用的手册所说,mysqlnd(PHP 5.3)将从准备好的语句返回本机数据类型,前提是您关闭 PDO 的准备好的语句模拟。

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

PDO::ATTR_STRINGIFY_FETCHES 与 MySQL 无关。

如果你看到好的一面,无论如何使用准备好的语句是一个好习惯,所以......;)

于 2009-07-29T00:08:30.283 回答
40

我不认为在 PHP 5.2 中可以使用“数字” :-(

如果我没记错的话,在 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 进行 PDO 的优势

mysqlnd 在使用服务器端准备语句时返回本机数据类型,例如,INT 列作为整数变量而不是字符串返回。这意味着内部的数据转换更少。

但这只是 PHP 5.3(前提是您的 PHP 5.3 版本是用 mysqlnd(而不是旧的 libmysql)编译的),而且似乎只适用于准备好的语句:-(

对不起...

一个解决方案是在 PHP 端拥有一个映射系统(如 ORM - 请参阅Doctrine;就像 ORM 的一个示例:我不知道它是否符合您的要求)来转换结果从数据库到 PHP 数据类型...

是的,如果你想使用像===!==这样的类型敏感的运算符,这很糟糕......

于 2009-07-28T22:12:14.840 回答
31

帕斯卡的回答是正确的。我在让它全部工作时遇到了一些麻烦。这是您需要做的。

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

pdo_mysql

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

如果您没有mysqlnd在客户端 API 版本中看到,而是看到类似...

Client API version => 5.5.29

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

其次,PDO默认为所有 MySQL连接使用模拟的预处理语句。荒谬,但它就在那里。只有当您使用真正的准备好的语句(在链接的博客文章中称为“服务器端准备好的语句”,现在在这里)时,您才会获得本机数据类型。因此,您必须将 PDO::ATTR_EMULATE_PREPARES 设置为 false,如下所示:

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

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

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
于 2013-03-23T22:26:54.063 回答
11

你可能已经mysqlnd安装了,但这并不意味着它可以被常规PDO扩展使用(pdo_mysql),这在共享主机上更常见,所以请确保启用nd_pdo_mysql扩展,并禁用其他扩展pdo_mysql,因为它可能会创建一个冲突。

@截屏

在此处输入图像描述

于 2017-07-28T06:21:22.813 回答