我正在将我的 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"
}
设置PDO::ATTR_EMULATE_PREPARES
为 false,如果您真的需要使用松散类型的 PHP
如果mysql_fetch_row
返回 SUM 的 int 或者(我从不关心检查) - 那么它会做一些魔术if (ctype_digit($val)) $row[$key] = (int)$val;
- 所以你可以在你的 DBAL 中做
据我了解准备语句的工作方式,它使用相同的数据包结构来发送和检索数据,并且该数据包包含数据类型。
看起来该服务器可以返回 2 种格式的数据 - 本机和 mysqlnd,具体取决于请求类型。后一个可以由客户端库解释以转换结果值。
对于记录,PDO 提供了一个可以改变这一点的功能,PDO::ATTR_STRINGIFY_FETCHES
:
获取时将数值转换为字符串。需要
bool
.
该设置背后的基本原理是数据库引擎可以处理非常大的数字(例如,Oracle 允许 38 位数字)而 PHP 不能。将这些数字作为字符串检索是一种确保安全并防止数据丢失的方法。
<?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"
}
您可以使用带有 JSON_NUMERIC_CHECK 选项的 json_encode 和 json_decode 来检索具有数字类型的数组:
$my_array = json_decode(json_encode( $my_array, JSON_NUMERIC_CHECK ));