问题:我正在学习更多关于SQL查询的知识,我试图理解为什么这个函数和查询只返回user_id为26和25但不返回27或31的任何内容的状态。
问题:为什么这不会返回用户27或31的状态? (我已确认用户27和31有返回的状态)
以下是代码:
public function t_status($friends, $groups, $user_id, $start, $per_page, $db){
$group_array = implode(',', $groups);
$friend_array = implode(',', $friends);
$stmt = $db->prepare("SELECT * FROM statuses WHERE (user_id IN (:friend_array) && user_id IS NOT NULL) OR user_id = :auth_id OR (group_id IN (:group_array) && group_id IS NOT NULL && group_id != 0) ORDER BY updated_at DESC LIMIT :offset, :limit");
$stmt->bindParam(':auth_id', $user_id);
$stmt->bindParam(':group_array', $group_array);
$stmt->bindParam(':friend_array', $friend_array);
$stmt->bindParam(':offset', $start, PDO::PARAM_INT);
$stmt->bindParam(':limit', $per_page, PDO::PARAM_INT);
$stmt->execute();
if ($stmt->rowCount() > 0) {
while($row = $stmt->fetchAll()) {
return $row;
}
}
}
当我print_r($ group_array)时,我得到51,而print_r($ friend_array)得到25,27,31。从我可以看到,它只是从朋友阵列25中的第一个用户获取状态而忽略了27和31。
我使用:
在phpmyadmin中测试了这个SELECT * FROM statuses WHERE (user_id IN (25,27,31) && user_id IS NOT NULL) OR user_id = 26 OR (group_id IN ('51,') && group_id IS NOT NULL && group_id != 0) ORDER BY updated_at DESC LIMIT 0, 10
这很好用。任何帮助将不胜感激。
答案 0 :(得分:1)
您在while循环中设置return $row;
。 return
立即退出函数,并且不执行任何其他迭代。您应该在数组中编写数据,然后返回数组:
$arr= array();
while($row = $stmt->fetch()) {
$arr[]=$row;
}
return $arr;
编辑:
绑定也有错误:WHERE (user_id IN (:friend_array)
因为它是文本id1,id2,id3
,所以它将被视为文本而不是ID数组。你不应该绑定这些ID,所以它必须如下所示:
WHERE (user_id IN ($friend_array)
并删除bind方法:friend_array
$stmt->bindParam(':friend_array', $friend_array);
- 必须删除
答案 1 :(得分:1)
我不相信PHP允许将数组绑定为这样的参数。这可以解释为什么您只获得数组中第一个值的结果。您需要将数组转换为以逗号分隔的字符串,然后从中构建SQL语句。请注意SQL注入的问题。
此外,使用column IN (x, y, z) AND column IS NOT NULL
是不必要的重复。如果列值位于值列表中,则不能为NULL
。即使NULL
列表中有IN
,也不会匹配。