如何将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
相关产品推荐
相关产品推荐

