PHP调用含JSON函数的MariaDB存储过程返回结果异常问题
解决MariaDB存储过程调用的两个JSON输出问题
问题1:结果键名为查询语句
原因是存储过程中SELECT的聚合表达式未指定别名,数据库默认用表达式本身作为列名。
解决方法:修改存储过程,给JSON聚合结果加别名
CREATE DEFINER=`user`@`localhost` PROCEDURE `db`.`test`(IN STR varchar (128)) BEGIN -- 给JSON_ARRAYAGG的结果指定别名`result` SELECT JSON_ARRAYAGG(JSON_OBJECT('AMNT', AMNT)) AS `result` FROM BOMI AS RES; END
问题2:JSON结果带反斜杠转义
原因是数据库返回的已经是序列化后的JSON字符串,PHP再调用json_encode会对该字符串进行二次转义。
解决方法:先解码数据库返回的JSON字符串,再编码输出
修改PHP处理结果的逻辑,将数据库返回的JSON字符串转为PHP数组/对象后再参与最终编码,同时改用预处理语句避免SQL注入:
$stmt = mysqli_prepare($link, "CALL test(?)"); mysqli_stmt_bind_param($stmt, "s", $param1); mysqli_stmt_execute($stmt); $data = []; if ($result = mysqli_stmt_get_result($stmt)) { if ($row = mysqli_fetch_assoc($result)) { // 将数据库返回的JSON字符串解码为PHP数组 $decodedData = json_decode($row['result'], true); if ($decodedData !== null) { $data = $decodedData; } } mysqli_free_result($result); } mysqli_stmt_close($stmt); // 最终输出时直接编码处理后的数组,无需额外转义 echo json_encode($data, JSON_UNESCAPED_SLASHES);
说明
- 预处理语句替代SQL拼接,彻底规避注入风险;
- 解码后的
$data是原生PHP数组,最终json_encode会生成正确的JSON格式,不会出现多余反斜杠; - 处理后输出结果与预期一致:
[{"AMNT": 1.0000},{"AMNT": 1.0000},{"AMNT": 1.0000}]
内容的提问来源于stack exchange,提问作者Bug
相关产品推荐
相关产品推荐

