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