点击关注按钮触发array_column()类型错误的排查求助
问题场景
按钮代码:
<a href="like.php?type=user&id=<?php echo $user_data['userid'] ?>"> <input id="post_button" type="button" value="Sledi <?php echo $mylikes ?>" style="margin-right: 10px; background-color: #119f8a; width: auto;"> </a>
点击后触发致命错误:
Fatal error: Uncaught TypeError: array_column(): Argument #1 ($array)
must be of type array, null given in
E:\xampp\htdocs\MyBook\classes\user.php:94 Stack trace: #0
E:\xampp\htdocs\MyBook\classes\user.php(94): array_column(NULL,
'userid') #1 E:\xampp\htdocs\MyBook\like.php(42):
User->follow_user('986841892650929...', 'user', '6781') #2 {main}
thrown in E:\xampp\htdocs\MyBook\classes\user.php on line 94
错误指向follow_user函数中的$user_ids = array_column($likes,"userid");行,函数完整代码:
public function follow_user($id,$type,$mybook_userid) { if($id == $mybook_userid && $type == 'user'){ return; } $DB = new Database(); //save likes details $sql = "select following from likes where type='$type' && contentid = '$mybook_userid' limit 1"; $result = $DB->read($sql); if(is_array($result)){ //print_r($result);die; $likes = json_decode($result[0]['following'],true); $user_ids = array_column($likes,"userid"); if(!in_array($id, $user_ids)) { $arr["userid"] = $id; $arr["date"] = date("Y-m-d H:i:s"); $likes[] = $arr; $likes_string = json_encode($likes); $sql = "update likes set following = '$likes_string' where type='$type' && contentid = '$mybook_userid' limit 1"; $DB->save($sql); $user = new User(); $single_post = $user->get_user($id); } else { $key = array_search($id, $user_ids); unset($likes[$key]); $likes_string = json_encode($likes); $sql = "update likes set following = '$likes_string' where type='$type' && contentid = '$mybook_userid' limit 1"; $DB->save($sql); } } else { $arr["userid"] = $id; $arr["date"] = date("Y-m-d H:i:s"); $arr2[] = $arr; $following = json_encode($arr2); $sql = "insert into likes (type,contentid,following) values ('$type','$mybook_userid','$following')"; $DB->save($sql); } }
执行print_r($result)返回:
Array ( [0] => Array ( [following] => ) )
likes表结构:
问题根源
当likes表中已有对应记录,但following列值为空字符串时,json_decode("", true)会返回null,而array_column要求第一个参数必须是数组,直接传入null就触发了类型错误。
解决步骤
处理json_decode的空值情况
在解码following字段后,立即检查结果是否为数组,若不是(比如null或空),则初始化为空数组。可以用空合并运算符简化:$likes = json_decode($result[0]['following'], true) ?? [];或者用传统判断:
$likes = json_decode($result[0]['following'], true); if (!is_array($likes)) { $likes = []; }适配空数组的逻辑
当$likes是空数组时,array_column($likes, "userid")会返回空数组,后续in_array($id, $user_ids)会返回false,自然走到添加新关注的分支,逻辑完全兼容。
修改后的核心代码片段:
if(is_array($result)){ // 处理空字符串解码为null的情况,初始化为空数组 $likes = json_decode($result[0]['following'], true) ?? []; $user_ids = array_column($likes,"userid"); if(!in_array($id, $user_ids)) { // 添加新关注的逻辑... } else { // 取消关注的逻辑... } }
额外提示:当前代码存在SQL注入风险,建议改用预处理语句替代直接拼接SQL字符串,避免安全问题。
内容的提问来源于stack exchange,提问作者user2980341

