You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:00:27