PHP PDO中fetchAll()配合json_encode为何将所有值转为字符串?
解决PDO查询后json_encode保留数值类型的问题
嘿,这个问题我之前也踩过坑!默认情况下PDO为了兼容不同数据库的差异,会把所有从数据库返回的值都转成字符串——哪怕是INT类型的ID也逃不过。不过有几种实用办法可以解决,看你的需求选就行:
方法一:修改PDO全局配置(推荐全局生效)
在初始化PDO连接的时候,加上两个关键配置,让PDO保留原生的字段类型:
$pdo = new PDO($dsn, $dbUser, $dbPass, [ PDO::ATTR_STRINGIFY_FETCHES => false, // 禁止把所有查询结果强制转成字符串 PDO::ATTR_EMULATE_PREPARES => false // 关闭模拟预处理,让PDO能正确识别数据库原生字段类型 ]);
配置完之后,所有用这个PDO连接执行的查询,INT、FLOAT这类数值类型都会保留原本的类型,再用json_encode输出时,ID就会是1而不是"1"了。
方法二:手动转换指定字段(适合个别场景)
如果没法修改PDO的全局配置,或者只想针对这一次查询处理,可以手动遍历结果集,把需要的字段转成对应类型:
$sql = "SELECT * FROM `Type`"; $stmt = $pdo->prepare($sql); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); // 遍历结果,把ID转成int类型 foreach ($result as &$row) { $row['ID'] = (int)$row['ID']; // 要是还有其他数值字段(比如价格、数量),也可以在这里一起转换 } unset($row); // 记得释放引用,避免后续代码出现意外问题 echo json_encode($result);
这种方法灵活性很高,只处理你需要的字段,不会影响其他查询的结果格式。
方法三:用json_encode的参数快速处理(简单但有风险)
还有个偷懒的办法——给json_encode加上JSON_NUMERIC_CHECK选项,它会自动把所有看起来像数字的字符串转成数值类型:
echo json_encode($result, JSON_NUMERIC_CHECK);
不过要注意,这个选项是“一刀切”的:如果你的字符串字段里有纯数字内容(比如用户输入的"123"作为字符串标识),它也会被强制转成数值。所以只有当你确定所有数字格式的字符串都应该是数值类型时,再用这个方法。
总结一下:
- 想要全局所有查询都保留原生类型?选方法一;
- 只需要处理个别查询或字段?选方法二;
- 想快速解决且没有字符串数字冲突的场景?选方法三。
内容的提问来源于stack exchange,提问作者JamMan9
相关产品推荐
相关产品推荐

