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

vic*_*ava 61 php mysql pdo

我正在使用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无关.

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

  • 这是胜利的答案^.^ (2认同)
  • 如果您知道字段将是数字,则始终可以向该字段添加零.$ values = $ stm-> fetch(); $ values ['numfield'] + = 0; //将强制值为数字.这适用于所有php版本. (2认同)
  • 这应该是正确答案。我启用了 mysqlnd 并且仍然将数字转换为字符串。只是按照这个答案并正确地获得了数字 (2认同)

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数据类型......

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

  • 在Ubuntu上尝试`sudo apt-get install php5-mysqlnd` (7认同)

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)

  • 请注意,即使使用此配置,`DECIMAL`类型仍将以字符串形式发送.在这里使用`mysqlnd`版本5.0.10. (8认同)
  • @Pere是为了防止小数在PHP中成为不可靠的浮点数而完成的. (3认同)

Aam*_*irR 5

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

@screenshot

在此处输入图片说明

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