SQL 查询未返回正确的值

Posted

技术标签:

【中文标题】SQL 查询未返回正确的值【英文标题】:SQL query not returning correct values 【发布时间】:2016-06-09 13:13:18 【问题描述】:

问题:我正在了解有关 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

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

【问题讨论】:

【参考方案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)

并移除 :friend_array 的绑定方法

$stmt->bindParam(':friend_array', $friend_array); - 必须删除

【讨论】:

现在可以工作了,谢谢,更重要的是我明白为什么它不起作用。您对数组和绑定问题的解释很有帮助。 我很高兴能帮上忙 :)【参考方案2】:

我不相信 PHP 允许将数组绑定为这样的参数。这可以解释为什么您只获得数组中第一个值的结果。您需要将数组转换为逗号分隔的字符串,然后从中构建您的 SQL 语句。请注意 SQL 注入的问题。

另外,使用column IN (x, y, z) AND column IS NOT NULL 是不必要的重复。如果列值在值列表中,则它不能是NULL。即使NULL 在您的IN 列表中,它也不会匹配。

【讨论】:

以上是关于SQL 查询未返回正确的值的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 查询不返回正确的值

使用子查询时“SQL 命令未正确结束”

Redshift 返回一个 []uint8 而不是整数,在它们之间转换会返回不正确的值

两个子查询单独工作正常但“SQL 命令未正确结束”当加入时除了 [解释说我是五岁]

尽管公式编码正确,但 Point 类中的距离函数未返回正确的值

未正确结束 sql 查询 [重复]