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 查询未返回正确的值的主要内容,如果未能解决你的问题,请参考以下文章
Redshift 返回一个 []uint8 而不是整数,在它们之间转换会返回不正确的值
两个子查询单独工作正常但“SQL 命令未正确结束”当加入时除了 [解释说我是五岁]