3

希望有人可以帮助解决这个让我疯狂多年的问题。我对 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 查询是否有问题???- 坚持下去更简单吗?

谢谢!

4

2 回答 2

2

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

$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 注入

于 2012-11-10T07:34:19.307 回答
1

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

$books = array();
$sql="SELECT * FROM Books WHERE BookID IN ('".join("','", $Booklist)."')";
while($row = mysqli_fetch_array($result)){
    $books[] = $row;
}
于 2012-11-10T07:20:36.873 回答