PHPとMySQLの間の相互作用中、開発者はしばしば関数multi_query()とnext_result()と接触します。ただし、多くの初心者は、ドキュメントを読んだり開発しようとするときに、これら2つの関数の使用を混乱させる傾向があり、 next_result()を使用して複数のSQLステートメントのみを実行できると誤って信じています。
この記事では、PHPでのこれら2つの機能の責任、作業メカニズム、使用の使用、およびnext_result()がmulti_query()を置き換えることができない理由を詳細に調べます。
Multi_Query()は、PHP MySQLI拡張機能の関数です。その機能は、複数のSQLステートメントを一度に実行することです。これらのSQLステートメントは、長いSQL文字列を形成するためにセミコロン( ; )で分離する必要があります。
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($mysqli->next_result());
} else {
echo "実行に失敗しました: " . $mysqli->error;
}
この例では、 Multi_Query()はMulti-Result Set Processing Flowを開始し、各ステートメントの結果にnext_result()を介してアクセスします。
next_result()の責任は、mysqliを次の結果セットにプッシュすることです。 SQLを実行するのではなく、 Multi_Query()によって実行された結果から次のステートメントの返された結果に移動するだけです。
つまり、 next_result()自体はsqlを実行せず、移動するだけです。
Multi_Query()の事前コールコールがなければ、 next_result()には何の関係もありません。それが依存するコンテキストは「複数のステートメントが実行された」です。
「なぜ電源を入れずにリモートコントロールを使用してテレビをオンにできないのですか?」と尋ねるようなものです。 next_result()はプロセスフローの一部であり、アクションの実行の開始点ではないためです。
さまざまな責任
Multi_Query()は執行者です。
next_result()はiteratorです。
依存関係
Multi_Query()のコンテキストがなければ、 next_result()を呼び出すとfalseが返されます。
next_result()は、 multi_query()が正常に実行された後にのみ理にかなっています。
エラー処理と状態管理
Multi_Query()は、すべてのステートメントを実行および初期化する責任があります。エラーが発生した場合、すぐに中断することができます。
next_result()は、sqlを再試行または再測定しない結果セットです。
シナリオ:テーブルの作成やデータ挿入など、複数の初期化ステートメントを実行する
$sql = "
CREATE TABLE IF NOT EXISTS logs (id INT AUTO_INCREMENT PRIMARY KEY, message TEXT);
INSERT INTO logs (message) VALUES ('正常に初期化');
SELECT * FROM logs;
";
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
echo $row['message'] . "\n";
}
$result->free();
}
} while ($mysqli->next_result());
} else {
echo "実行エラー: " . $mysqli->error;
}
このアプリケーションは、展開スクリプト、データのバッチ初期化などのシナリオに適用できます。
PHPデータベースプログラミングでは、 Multi_Query()およびnext_result()は、一緒に使用されるツールのペアです。前者は、実行のためにデータベースに複数のステートメントを送信する責任がありますが、後者は各ステートメントの実行結果を取得する責任があります。
next_result()を使用してSQLステートメントを実行しようとすることは、「リモートコントロールでのみテレビをオンにするが、プラグインしていない」と同等であり、タスクを個別に完了することはできません。それぞれの責任とコンテキストを完全に理解することによってのみ、効率的で安定したデータベースインタラクションコードを作成できます。
https://gitbox.net/api/sql-execに複数のステートメントを送信するなど、マルチステートメント実行をテストするためにRESTインターフェイスを使用している場合は、 Multi_Query()の効果をシミュレートするためにマルチステートメント実行方法を使用することも忘れないでください。