PHP'IN'查询只返回1行

时间:2012-04-13 16:40:51

标签: php arrays implode

任何人都可以解释为什么最后一个查询总是返回1行。它应该返回多于1,因为数据库中有很多记录!

抱歉我的英文不好

            $query=mysql_query("SELECT book_id FROM ".DB_PREF."books_cats_list WHERE cat_id='".$cat."'");
            if($row=mysql_num_rows($query))
            {

                //fetching all books from $cat category
                for($i=0; $fetch=mysql_fetch_assoc($query); $i++)
                {
                    $records[$i]=$fetch['book_id'];
                }

                //Joining all records in a string for next query
                $records=implode(",",$records);

                //returning num rows if there're book_id records in $records array
                $query=mysql_query("SELECT * FROM ".DB_PREF."books WHERE book_id IN ('".$records."')");
                $rows=mysql_num_rows($query);
                echo $rows;

2 个答案:

答案 0 :(得分:4)

您的查询将如下所示:

SELECT * FROM books WHERE book_id IN ('2,3,4,5')

请注意IN内的所有字符串。这一个字符串将转换为int。这是通过停在第一个非数字字符发生的。因此,查询变为:

SELECT * FROM books WHERE book_id IN (2)

尝试删除IN

中的单引号

注意:如果您的值不是整数,请尝试将implode更改为:implode("','",$records),并将引号保留在IN内。

答案 1 :(得分:1)

快速浏览一下我建议使用for循环:

for($i=0; $fetch=mysql_fetch_assoc($query); $i++)

应该是一个while循环:

while($fetch=mysql_fetch_assoc($query))

我希望它只用循环代码做一条记录。

我建议你做左连接选择

SELECT * FROM books_cats_list as cat
left join books as book on cat.book_id = book.book_id
WHERE cat.cat_id='$cat'

就我期望的数据库性能而言,这将更加优化。