データベース操作にPHPとMySqliを使用する場合、通常、一度に1つのクエリのみを実行します。ただし、一部の複雑なビジネスシナリオでは、複数のクエリステートメントを1つのリクエストで実行する必要がある場合があり、この時点で複数の結果セットを処理する必要があります。 PHPのMySQLI拡張機能は、これらの結果セットを通過するのに役立つnext_result()関数を提供します。
通常、複数の結果セットが、複数のステートメントを含むSQLクエリが実行されたときに発生します。たとえば、:
SELECT * FROM users; SELECT * FROM orders;
これは、SQLがストアドプロシージャ(ストアドプロシージャ)またはバッチで実行される場合に一般的です。 PHPのmysqli_multi_query()は、この形式のバッチ実行をサポートしています。
mysqli_multi_query()とnext_result()を使用してPHPで複数の結果セットを処理するための基本的な手順は次のとおりです。
データベース接続を作成します
mysqli_multi_query()を使用して、マルチステートメントクエリを実行します
Store_Result()を使用して、現在の結果を取得します
next_result()を使用して、次の結果セットに移動します
複数の結果セットを繰り返してデータを抽出する方法を示す具体的な例を以下に示します。
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
$sql = "SELECT id, username FROM users; SELECT id, order_date FROM orders;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
$result->free();
}
// より多くの結果セットがあるかどうかを確認してください
if ($mysqli->more_results()) {
echo "<hr>次の結果セット:<br>";
}
} while ($mysqli->next_result());
} else {
echo "クエリの実行に失敗しました: " . $mysqli->error;
}
$mysqli->close();
?>
SQLステートメントがセミコロンで区切られていることを確認してください。これはMulti_Query()に必要です。
各結果セットはstore_result()を使用して抽出する必要があり、リソースは時間内にリリースする必要があります。
next_result()はデータを返しません。その機能は、 store_result()を有効にして次の結果セットを抽出することです。
デバッグ中に、 mysqli->エラーを印刷してエラー情報を表示できます。
バッチの複数のテーブルからデータを読み、同じページに表示します
複数の結果セットを返すストアドプロシージャを呼び出します
複雑な統計分析SQLクエリを実行する場合
マルチステートメントクエリを実行するときは、SQLインジェクションのリスクに注意してください。 prepere and bind_paramメソッドを使用することはより安全なアプローチですが、 multi_query()自体は準備をサポートしていませんが、リスクを回避するためにロジックを複数の単一クエリに分割できます。