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

如何将json_encode结果中的null转为空字符串?array_walk报错排查

问题分析与解决方案

首先,你用array_walk()的思路本身在处理数组时是可行的,但你的问题出在$tem并不是数组——它是一个单个的字符串(或null),这才导致了array_walk() expects parameter 1 to be array, string given的错误。

我们先拆解你的代码逻辑:

  • 当SELECT * FROM allid WHERE postid='$oldid' AND spaceid='$newid'这条查询没有匹配到数据时,mysqli_fetch_assoc($rresult)会返回null,此时$lrow['postid']就会是null,赋值给$tem后,json_encode($tem)就会把null转成字符串"null",这就是你输出里那些null的来源。
  • 当查询有结果时,$tem是字符串类型的ID值,json_encode后会输出带引号的字符串(比如"10")。

正确的处理方式

你不需要用array_walk,直接在给$tem赋值时就处理null情况即可:

if ($uresult->num_rows > 0) {
    while($urow = $uresult->fetch_assoc()) {
        $rresult = mysqli_query($con,"SELECT * FROM allid WHERE postid='$oldid' AND spaceid='$newid'");
        $lrow = mysqli_fetch_assoc($rresult);
        // 关键:判断lrow是否存在,不存在则赋值为空字符串
        $tem = $lrow ? $lrow['postid'] : '';
        $ujson = json_encode($tem);
        echo $ujson;
    }
} else {
    // 可以在这里处理无数据的情况,比如输出空字符串或提示
}

这样修改后,当查询不到数据时,$tem会是空字符串,json_encode后输出"",你的最终输出就会变成"10""""""25"(如果需要用逗号分隔JSON值,你可能还要额外处理输出格式,但这是另一个问题)。

额外的安全建议

你的SQL语句存在SQL注入风险,直接把变量拼进SQL里是非常危险的。建议改用mysqli预处理语句,示例如下:

// 用预处理语句替代直接拼接
$stmt = mysqli_prepare($con, "SELECT postid FROM allid WHERE postid=? AND spaceid=?");
mysqli_stmt_bind_param($stmt, "ss", $oldid, $newid);
mysqli_stmt_execute($stmt);
$rresult = mysqli_stmt_get_result($stmt);
$lrow = mysqli_fetch_assoc($rresult);

这样能有效避免SQL注入攻击,让代码更安全。

内容的提问来源于stack exchange,提问作者Laney Williams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:54:04