mysqliを使用してマルチクエリステートメントを実行する場合、各結果セットを処理する必要がある場合があります。 PHPは、 mysqli_more_results()とmysqli_next_result()の2つの機能を提供し、これらの結果を優雅に通過できるようにします。
この記事では、実際のコード例を使用して、 mysqli_next_result()への誤った呼び出しを回避するために、 mysqli_more_results()を使用して次の結果セットがあるかどうかを判断する方法を説明します。
たとえば、SQLステートメントのセットがあるとします。
SELECT * FROM users;
SELECT * FROM orders;
SELECT * FROM products;
それらを一度に実行し、各クエリの結果を1つずつ処理します。この状況は、バックエンドバッチデータ表示、データの初期化、その他の目的の管理に適しています。
まず、 Multi_Queryを使用してデータベースに接続し、複数のSQLステートメントを実行する必要があります。
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
$sql = "
SELECT * FROM users;
SELECT * FROM orders;
SELECT * FROM products;
";
if ($mysqli->multi_query($sql)) {
do {
// 現在の結果セットを処理します
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
// 別の結果セットがあるかどうかを確認してください
if ($mysqli->more_results()) {
echo "より多くの結果セットがあります,処理を継続する準備ができています...\n";
} else {
echo "すべての結果が処理されています。\n";
}
} while ($mysqli->more_results() && $mysqli->next_result());
} else {
echo "実行に失敗しました: " . $mysqli->error;
}
$mysqli->close();
この例では、次のキー関数を使用します。
mysqli :: multi_query($ query)
複数のSQLステートメントを含むクエリをデータベースに送信します。
mysqli :: store_result()
現在の結果セットを取得します。
mysqli :: more_results()
残りの結果セットがまだあるかどうかを確認してください。
mysqli :: next_result()
次の結果セットに移動して、処理を続けることができます。
doを通して... mysqli_more_results()とmysqli_next_result()を組み合わせている間、 next_result()を正しく呼び出すときに未定義の動作またはエラーを回避するために、すべての結果セットを安全に処理できます。
一部の開発者は、より多くの結果があるかどうかを確認せずに、 mysqli_next_result()をループで直接使用する場合があります。これは、次のエラーにつながる可能性があります。
// 間違った使用法:チェックされていません more_results() 電話してください next_result()
while ($mysqli->next_result()) {
// 結果セットの処理
}
そうすることで、後続の結果なしに警告またはエラーが発生する場合があります。したがって、 next_result()を呼び出す前に、常にmore_results()に確認する必要があります。
mysqli_more_results()は、 multi_query()を使用した後、より多くの結果セットがあるかどうかを判断するための重要なツールです。 MySQLI_NEXT_RESULT()で使用すると、プログラムロジックの堅牢性を確保し、結果セットへのバウンド外アクセスによって引き起こされるエラーを回避できます。
レポートシステムやバックグラウンドデータバッチロジックの構築などの実際のプロジェクトでは、この手法を習得すると、PHPプログラムがより信頼性が高く維持可能になります。
詳細については、開発文書https://gitbox.net/docsをご覧ください