为什么不是PDO_MySQL返回整数?
我迁移我的PHP代码从mysql
(5.5不建议使用)到PDO_MySQL
。但是,mysql_fetch_row
返回整数,而PDOStatement::fetch
返回数字的字符串。我如何使PDO像前一个一样行事?为什么不是PDO_MySQL返回整数?
结果的mysql_fetch_row
:
PDOStatement::fetch
array(1) {
["id"]=>
int(1)
}
:
array(1) {
["id"]=>
string(1) "1"
}
设置PDO::ATTR_EMULATE_PREPARES
为false,如果你真的需要它松散类型的PHP
如果mysql_fetch_row
你INT返回对于SUM(我从来没有关心检查) - 然后它做了一些像if (ctype_digit($val)) $row[$key] = (int)$val;
- 所以y OU可以在DBAL
做,据我了解的方式准备好的语句的作品,它使用相同的包结构,无论是发送和接收数据,而这个数据包中包含的数据类型。
它看起来像该服务器可以在2种格式返回数据 - 本地和mysqlnd,取决于请求类型。后一个可以由客户端库解释以产生结果值。
对于记录,PDO提供了一个功能,它会改变这一点,PDO::ATTR_STRINGIFY_FETCHES
:
取时将数字值的字符串。需要
bool
。
该设置的基本原理是数据库引擎可以处理非常大的数字(例如,Oracle允许38位数字),而PHP不能。将这些数字作为字符串检索是一种保持安全并防止数据丢失的方法。
不幸,the MySQL driver does not support it:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'test', 'test');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$sql = 'SELECT 1 AS integer_number, 3.14 AS floating_point';
$res = $pdo->query($sql);
while($row = $res->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
array(2) {
["integer_number"]=>
string(1) "1"
["floating_point"]=>
string(4) "3.14"
}
我喜欢答案的基本原理部分,但如果我看到正确使用,MySQL PDO不支持'PDO :: ATTR_STRINGIFY_FETCHES',因为_everything_已经作为'string'数据类型返回,意思是这个'属性'对于那个驱动来说是相当无用的。 – Jon 2013-04-21 09:02:25
@Jon - 你说得对,我刚刚找到它,我已经更新了我的答案。 – 2013-04-21 09:08:38
它工作在大多数情况下,但对于'SELECT SUM不工作(...'此外,正如其名称所示,预备陈述的好处是否对这个选项无效? – Haocheng 2013-04-21 09:08:18
对于谁在将来读这个答案:1)不,他没有误读这个问题。 2)是的,它实际上改变了返回值的数据类型。 – 2013-04-21 09:10:50
@Haocheng读这句话仔细,这是双重否定;) – 2013-04-21 09:14:08