2012-04-13 91 views
1

任何人都可以解释为什么最后一次查询总是返回1行。它应该返回多于1,因为数据库中有很多记录!PHP'IN'查询只返回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; 
+0

您应该使用mysql_fetch_assoc()来读取第二个查询结果,就像第一个查询结果一样。 – MarcinJuraszek 2012-04-13 16:42:59

回答

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之内。

+0

尝试过,仍然不能正常工作:( – 2012-04-13 16:47:33

+0

好吧,它似乎适用于你的最后一个笔记申请:) – 2012-04-13 16:48:22

+0

@AntonioCiccia:很高兴我能帮忙:-) – 2012-04-13 17:41:07

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' 

这将是迄今为止在数据库性能我预期方面更为优化。