18

我正在将我的 PHP 代码从mysql(在 5.5 中弃用)迁移到PDO_MySQL. 但是,mysql_fetch_row返回整数,而PDOStatement::fetch返回数字的字符串。如何使 PDO 表现得像前一个?

结果mysql_fetch_row

array(1) {
  ["id"]=>
  int(1)
}

结果PDOStatement::fetch

array(1) {
  ["id"]=>
  string(1) "1"
}
4

3 回答 3

13

设置PDO::ATTR_EMULATE_PREPARES为 false,如果您真的需要使用松散类型的 PHP

如果mysql_fetch_row返回 SUM 的 int 或者(我从不关心检查) - 那么它会做一些魔术if (ctype_digit($val)) $row[$key] = (int)$val;- 所以你可以在你的 DBAL 中做

据我了解准备语句的工作方式,它使用相同的数据包结构来发送和检索数据,并且该数据包包含数据类型。

看起来该服务器可以返回 2 种格式的数据 - 本机和 mysqlnd,具体取决于请求类型。后一个可以由客户端库解释以转换结果值。

于 2013-04-21T08:53:24.133 回答
13

对于记录,PDO 提供了一个可以改变这一点的功能,PDO::ATTR_STRINGIFY_FETCHES

获取时将数值转换为字符串。需要bool.

该设置背后的基本原理是数据库引擎可以处理非常大的数字(例如,Oracle 允许 38 位数字)而 PHP 不能。将这些数字作为字符串检索是一种确保安全并防止数据丢失的方法。

不幸的是,MySQL 驱动程序不支持它

<?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"
}
于 2013-04-21T08:56:49.197 回答
4

您可以使用带有 JSON_NUMERIC_CHECK 选项的 json_encode 和 json_decode 来检索具有数字类型的数组:

$my_array = json_decode(json_encode( $my_array, JSON_NUMERIC_CHECK ));
于 2018-09-26T15:02:11.193 回答