为什么不是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,取决于请求类型。后一个可以由客户端库解释以产生结果值。

+0

它工作在大多数情况下,但对于'SELECT SUM不工作(...'此外,正如其名称所示,预备陈述的好处是否对这个选项无效? – Haocheng 2013-04-21 09:08:18

+0

对于谁在将来读这个答案:1)不,他没有误读这个问题。 2)是的,它实际上改变了返回值的数据类型。 – 2013-04-21 09:10:50

+0

@Haocheng读这句话仔细,这是双重否定;) – 2013-04-21 09:14:08

对于记录,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" 
} 
+0

我喜欢答案的基本原理部分,但如果我看到正确使用,MySQL PDO不支持'PDO :: ATTR_STRINGIFY_FETCHES',因为_everything_已经作为'string'数据类型返回,意思是这个'属性'对于那个驱动来说是相当无用的。 – Jon 2013-04-21 09:02:25

+0

@Jon - 你说得对,我刚刚找到它,我已经更新了我的答案。 – 2013-04-21 09:08:38