for循环中的多个mysql查询

时间:2012-11-10 07:10:24

标签: php mysql arrays loops

希望有人可以帮助解决这个让我疯狂多年的问题。我是mysql / php的新手。

我有一个数组[$ Booklist],它包含一系列引用Books表中BookID的数字。然后,我查询数据库以获取与每个ID相关的详细信息:

for($s=0;$s<$smax+1;$s++){
  $sql="SELECT * FROM Books WHERE BookID = '$Booklist[$s]' ";
  $result=mysql_query($sql) or exit();

  while($row = mysql_fetch_array($result))
   {
    $Title[$s]=$row['Title'];
    $Author[$s]=$row['Author'];
    $Publisher[$s]=$row['Publisher'];
    $Year[$s]=$row['Year'];
  }
}

这很好用。但我从来没有喜欢从php for循环中运行多个查询。

重要的是,允许在$ Booklist数组中使用重复的BookID。并且必须保留$ Booklist数组中的ID顺序(带有重复项),以便$ Title和$ Author数组的内容具有正确的顺序,包括重复。希望有意义!

我试过这样做:

$sql="SELECT * FROM Books WHERE BookID IN ('".join("','", $Booklist)."') 
ORDER BY FIELD(BookID, '".join("','", $Booklist)."')";
$s=0;
  while($row = mysql_fetch_array($result))
   {
    $Title[$s]=$row['Title'];
    $Author[$s]=$row['Author'];
    $Publisher[$s]=$row['Publisher'];
    $Year[$s]=$row['Year'];
    $s++;
  }

但这意味着$ Booklist中的任何重复都没有在$ Title,$ Author等中反映出来,所以我把它取消了。

我的问题是 - for循环中的mysql查询是否有更好的解决方案?或者,从for循环运行多个mysql查询是否有问题? - 坚持下去是否更简单?

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为您需要的是以下内容。它执行单个查询,然后根据查询返回的数据创建4个数组,同时使用$booklist变量作为订单:

$sql = "SELECT * FROM Books WHERE BookID IN ('".join("','", array_map('mysqli_real_escape_string',$Booklist))."')";
$result = mysqli_query($sql) or exit();
$rows   = array();
while ($row = mysqli_fetch_array($result)) {
    $rows[$row['BookId']] = $row;
}

$i = 0;
foreach ($Booklist as $bookId) {
    if (isset($rows[$bookId])) {
        $Title[$i]     = $rows[$bookId]['Title'];
        $Author[$i]    = $rows[$bookId]['Author'];
        $Publisher[$i] = $rows[$bookId]['Publisher'];
        $Year[$i]      = $rows[$bookId]['Year'];
        $i++;
    }
}

另请注意,我添加了mysqli_real_escape_string以防止sql注入

答案 1 :(得分:1)

我不确定我的问题是你的代码问题,但这对你有用吗?我只是将检索到的书放在一个数组中。重复的书应该都在那里。

$books = array();
$sql="SELECT * FROM Books WHERE BookID IN ('".join("','", $Booklist)."')";
while($row = mysqli_fetch_array($result)){
    $books[] = $row;
}