我有这段代码:
$query_search_select = $db->prepare("SELECT * , COUNT(*) AS coun FROM users WHERE user LIKE :keyword ;");
$query_search_select->bindParam(":keyword" , $key_search , PDO::PARAM_STR ) ;
$query_search_select->execute();
查询有效,但当我将信息作为:
while($res = $query_search_select->fetch(PDO::FETCH_ASSOC)){
// code
}
但循环只有1次,在COUNT(*)结果2(它是对的)但这个循环只有1次......为什么?我在stackoverflow和互联网上搜索,我尝试了fetchAll但是我有同样的问题......
答案 0 :(得分:1)
试试这个
$result = $query_search_select->fetchAll(PDO::FETCH_ASSOC);
print_r($result);
注意:您不必使用while
fetchAll
在您的情况下,您应该看到所有信息是否都在结果中
while($res = $query_search_select->fetch(PDO::FETCH_ASSOC)){
$collection[] = $res;
}
print_r($collection);
但如上所示,这可以在一行中处理:)
注2:您在select语句中的计数有点无用。实际上,您已经影响了行,您可以使用$query_search_select->rowCount();
注3:
检查您的LIKE
声明。那里没有%
。如果您的数据库中有 foo 和 foobar 并使用您的语句,就像您构建搜索 foo 一样,那么您只会
获得1结果返回!!! LIKE
语句如下所示:
SELECT * FROM X WHERE name LIKE '%foo%'
返回名称为foo
的商品,条目可以包含foo之前和之后的值
SELECT * FROM X WHERE name LIKE '%foo'
返回名称为foo
的商品,条目可以在foo之前具有值
SELECT * FROM X WHERE name LIKE 'foo%'
返回名称为foo
的商品,条目可以包含foo后的值
SELECT * FROM X WHERE name LIKE 'foo'
返回名称为foo
的商品,条目 CAN' T 具有foo之后或之前的值
答案 1 :(得分:1)
问题在于,COUNT()
是GROUP BY
或汇总功能
(见http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html)
因此,如果您在COUNT()
语句中使用MySQL
,则结果集会自动分组到一行。
但是你仍然可以这样做:
"SELECT * , (SELECT COUNT(*) FROM users WHERE user LIKE :keyword) AS coun FROM users WHERE user LIKE :keyword2"
注意:强>
您必须添加另一个参数绑定,因为参数只能在MySQL
语句中使用一次:
$query_search_select->bindParam(":keyword2" , $key_search , PDO::PARAM_STR ) ;
答案 2 :(得分:0)
我今天第二次回答这个问题。不要在循环中使用fetchAll()
。它返回一个数组。如果你需要查找PHP数组以了解这意味着什么,我建议采取行动。
然后遍历返回的数组,而不是试图遍历迭代fetch()
的结果。