获取用户关联全部关注者数据异常问题排查
问题:每个用户仅显示单个关注者数据的修复方案
问题根源
你的PHP代码中,while循环内直接将$followers[$OutputData['user_id']]赋值为单个关注者数组,导致同一user_id下的后续关注者数据会覆盖之前的条目,最终每个用户仅保留了最后一条关注者记录。
修正后的PHP代码
require_once("config.php"); class FollowerMockApi { public static function Select(){ $db = new connect(); $followers = array(); // 用显式JOIN语法+指定字段,避免字段名冲突 $stmt = $db->prepare('SELECT followers.user_id, user.id AS follower_id, user.name AS follower_name FROM followers INNER JOIN user ON followers.follower_id = user.id'); $stmt->execute(); while($OutputData = $stmt->fetch(PDO::FETCH_ASSOC)) { // 追加关注者到对应用户的数组,而非覆盖 $followers[$OutputData['user_id']][] = array( 'id' => $OutputData['follower_id'], 'follower' => $OutputData['follower_name'] ); } return json_encode($followers); } } // 先设置响应头,再输出JSON(符合HTTP规范) header('Content-Type: application/json'); echo FollowerMockApi::Select();
修改细节说明
- 数组赋值逻辑调整:把
$followers[$OutputData['user_id']] = array(...)改为$followers[$OutputData['user_id']][] = array(...),实现同一用户下的关注者数据追加存储。 - SQL语句优化:使用显式
INNER JOIN替代隐式连接,同时给重复字段(如id)设置别名,避免取值混淆。 - 响应头顺序修正:将
header('Content-Type: application/json')移到echo之前,确保响应头在输出内容前发送。
原数据表结构(SQL)
CREATE TABLE `followers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `follower_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8mb4; CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(128) NOT NULL, `lastname` varchar(128) NOT NULL, `email` varchar(255) NOT NULL, `password_hash` varchar(255) NOT NULL, `ip` varchar(255) NOT NULL, `profile_image` varchar(1000) NOT NULL, `cover_image` varchar(1000) NOT NULL, `verified` tinyint(1) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB AUTO_INCREMENT=115 DEFAULT CHARSET=utf8mb4;
内容的提问来源于stack exchange,提问作者Stackassolle
相关产品推荐
相关产品推荐

