SQL查询未返回正确的值

时间:2016-06-09 13:13:18

标签: php sql pdo

问题:我正在学习更多关于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

这很好用。任何帮助将不胜感激。

2 个答案:

答案 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,也不会匹配。