我正在将我的PHP代码从mysql(在5.5中弃用)迁移到PDO_MySQL.但是,mysql_fetch_row返回整数,同时PDOStatement::fetch返回数字的字符串.如何让PDO像前者一样?
结果mysql_fetch_row:
array(1) {
["id"]=>
int(1)
}
Run Code Online (Sandbox Code Playgroud)
结果PDOStatement::fetch:
array(1) {
["id"]=>
string(1) "1"
}
Run Code Online (Sandbox Code Playgroud)
You*_*nse 13
设置PDO::ATTR_EMULATE_PREPARES为false,如果你真的需要松散类型的PHP
如果mysql_fetch_row返回你为SUM的int(我从不关心检查) - 那么它会做一些神奇的if (ctype_digit($val)) $row[$key] = (int)$val;- 所以你可以在你的DBAL中做
据我所知,预处理语句的工作方式,它使用相同的数据包结构来发送和检索数据,这个数据包包含数据类型.
看起来服务器可以返回2种格式的数据 - native和mysqlnd,取决于请求类型.后者可以由客户端库解释以转换结果值.
Álv*_*lez 11
对于记录,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);
}
Run Code Online (Sandbox Code Playgroud)
array(2) {
["integer_number"]=>
string(1) "1"
["floating_point"]=>
string(4) "3.14"
}
Run Code Online (Sandbox Code Playgroud)
您可以使用 json_encode 和 json_decode 以及 JSON_NUMERIC_CHECK 选项来检索具有数字类型的数组:
$my_array = json_decode(json_encode( $my_array, JSON_NUMERIC_CHECK ));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6888 次 |
| 最近记录: |