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

点击关注按钮触发array_column()类型错误的排查求助

问题解决思路:follow_user函数中的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表结构

问题根源

当likes表中已有对应记录,但following列值为空字符串时,json_decode("", true)会返回null,而array_column要求第一个参数必须是数组,直接传入null就触发了类型错误。

解决步骤

  1. 处理json_decode的空值情况
    在解码following字段后,立即检查结果是否为数组,若不是(比如null或空),则初始化为空数组。可以用空合并运算符简化:

    $likes = json_decode($result[0]['following'], true) ?? [];
    

    或者用传统判断:

    $likes = json_decode($result[0]['following'], true);
    if (!is_array($likes)) {
        $likes = [];
    }
    
  2. 适配空数组的逻辑
    当$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:15:18