我正在使用PDO和MySQL,出于某种原因,当从数据库获取int类型的值时,PDOStatement返回数字的字符串表示而不是数字类型的值.我该如何防止这种情况发生?
我注意到有一个PDO类的属性:PDO::ATTR_STRINGIFY_FETCHES
应该处理这个,但是,当试图修改它时,它会抛出一个错误,说该属性对MySQL驱动程序无效.
在咨询数据库时获取字符串而不是数字是否正常?
Jos*_*vis 64
要先回答你的上一个问题,"是的,"不幸的是,接收数字作为字符串是正常的.正如Pascal引用的手册所说,mysqlnd(PHP 5.3)将从预准备语句返回本机数据类型,前提是您从PDO关闭准备好的语句模拟.
new PDO($dsn, $user, $pass, array(
PDO::ATTR_EMULATE_PREPARES => false
))
Run Code Online (Sandbox Code Playgroud)
PDO :: ATTR_STRINGIFY_FETCHES与MySQL无关.
如果你看一下好的一面,最好使用准备好的陈述,所以...;)
Pas*_*TIN 39
我不认为在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的一个例子:我不知道它是否符合你的要求)来转换结果从DB到PHP数据类型......
是的,如果你想使用像===
和!==
这样的类型敏感的运算符,这是不好的...
Ale*_*den 28
帕斯卡的答案是正确的.我有点麻烦让它全部工作.这是你需要做的.
首先,确保安装并激活了mysqlnd.看看php --info
.在pdo_mysql部分中,它应该如下所示:
pdo_mysql
PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321
Run Code Online (Sandbox Code Playgroud)
如果不是mysqlnd
在Client API版本中看到,您会看到类似于......的行
Client API version => 5.5.29
Run Code Online (Sandbox Code Playgroud)
...然后你没有安装和运行mysqlnd.先照顾好.
其次,PDO 默认为所有MySQL连接使用模拟的预准备语句.荒谬,但确实如此.只有当您使用真实的预处理语句(在链接的博客文章中称为"服务器端预处理语句",现在在此处)时,您才会获得本机数据类型.所以你必须将PDO :: ATTR_EMULATE_PREPARES设置为false,如下所示:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Run Code Online (Sandbox Code Playgroud)
最后,确保未将PDO :: ATTR_STRINGIFY_FETCHES设置为true.
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
Run Code Online (Sandbox Code Playgroud)