3

何年もの間私を狂わせてきたこの問題を誰かが助けてくれることを願っています. 私はmysql/phpを初めて使用します。

Books テーブルの BookID を参照する一連の数字で構成される配列 [$Booklist] があります。次に、データベースにクエリを実行して、各 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++;
    }
}

また、SQL インジェクションを防ぐために mysqli_real_escape_string を追加したことにも注意してください。

于 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 に答える