PDO::ATTR_EMULATE_PREPARES为True时如何避免结果集中Int类型被转换为String

1. 运行环境

1). 当前使用的版本?

PHP 版本:7.3.24

pdo_mysql

PDO Driver for MySQL => enabled

Client API version => mysqlnd 5.0.12-dev - 20150407 - $Id: 7cc7cc96e675f6d72e5cf0f267f48e167c2abb23 $

2. 问题描述?

项目需要在PHP中使用PDO操作数据库时需要把PDO::ATTR_EMULATE_PREPARES属性设置为True,即使用本地模拟prepare,设置后结果集中的Int类型会被转换为String,

array(2) { [“tid”]=> string(2) “66” [“tval”]=> string(5) “hello” }

tid在数据库中定义为BigInt

$sth = $db->prepare('SELECT * FROM dtt_gen WHERE tval = ?');
$sth->execute(['hello']);
$res2 = $sth->fetch(PDO::FETCH_ASSOC);
var_dump($res2);

请问如何在PDO::ATTR_EMULATE_PREPARES => true的情况下让结果集中的Int类型不被转换为String呢?

3. 您期望得到的结果?

同时满足PDO::ATTR_EMULATE_PREPARES => true和结果集数据类型不被隐式转换

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

PDO的BUG,PHP8.1应该是好的,如果你一定要用7.3,方案如下:

新建BaseModel,构造函数里面以下

SELECT
    COLUMN_NAME AS `field`,
    DATA_TYPE AS `type`,
    COLUMN_TYPE AS `column_type` ,
    TABLE_NAME,
    TABLE_SCHEMA
FROM
    INFORMATION_SCHEMA.COLUMNS 
WHERE
    TABLE_NAME ='表名' 
AND TABLE_SCHEMA = '库名'

然后根据这个结果,把各种int的字段自己处理一下就可以了

3年前 评论
DylanSsun (楼主) 3年前
aab 3年前
讨论数量: 3

PDO的BUG,PHP8.1应该是好的,如果你一定要用7.3,方案如下:

新建BaseModel,构造函数里面以下

SELECT
    COLUMN_NAME AS `field`,
    DATA_TYPE AS `type`,
    COLUMN_TYPE AS `column_type` ,
    TABLE_NAME,
    TABLE_SCHEMA
FROM
    INFORMATION_SCHEMA.COLUMNS 
WHERE
    TABLE_NAME ='表名' 
AND TABLE_SCHEMA = '库名'

然后根据这个结果,把各种int的字段自己处理一下就可以了

3年前 评论
DylanSsun (楼主) 3年前
aab 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!