PHP用户关注功能报错求助:Johnny关注Billy时触发Uncaught TypeError错误
首先看报错信息,问题明明白白出在array_column(NULL, 'userid')——当Johnny尝试关注Billy时,传给array_column的第一个参数是null,不符合函数要求的数组类型,直接触发了致命错误。
问题根源
盯着你的follow_user方法代码看,问题藏在这两行里:
$likes = json_decode($result[0]['following'],true); $user_ids = array_column($likes, "userid");
当数据库中likes表对应Billy的那条记录里,following字段的值是空字符串、无效JSON,或者其他无法被json_decode解析成数组的内容时,json_decode会直接返回null。这时候你直接把$likes丢给array_column,自然就撞了TypeError的枪口。
至于为什么Billy关注Johnny没问题,反过来就出状况?大概率是Billy对应的likes记录里的following字段存在格式异常——比如之前的操作导致它变成了空字符串,而非标准的空JSON数组[]。
解决方法
核心思路就是确保$likes始终是一个数组,哪怕json_decode失败或者返回null。可以这么修复:
给
json_decode加兜底逻辑
用空合并运算符给$likes兜底成空数组,再额外加一层类型检查确保安全:// 替换原来的$likes和$user_ids两行代码 $following_data = $result[0]['following']; $likes = json_decode($following_data, true) ?? []; // 额外保险:如果解析后不是数组,强制设为空数组 if (!is_array($likes)) { $likes = []; } $user_ids = array_column($likes, "userid");修复数据库里的异常数据
找到likes表中type='user'且contentid为Billy用户ID的记录,把following字段的值改成[](标准空JSON数组),避免后续操作再踩同样的坑。优化插入逻辑(可选)
你当前else分支的插入逻辑是没问题的($arr2[] = $arr; $following = json_encode($arr2);),但可以额外验证下json_encode的结果,确保不会插入无效值,从源头减少异常数据的产生。
这样修改后,就算数据库里的following字段存在异常,代码也能安全处理,不会再抛出致命错误。
内容的提问来源于stack exchange,提问作者justRyan

