next_result()関数は、PHPおよびMySQLのMySQLI拡張機能を使用してマルチステートメントクエリを処理する際に重要な役割を果たします。複数の結果セットをシーケンスで取得することができますが、「同期していないコマンド」など、結果セットを切り替えると、さまざまな予期しない問題に遭遇する場合があります。このコマンドを実行できません」。この記事では、ロギングを介してnext_result()関数に関連する問題を見つけてトラブルシューティングする方法を紹介します。
mysqli :: multi_query()を使用すると、クエリで複数のSQLステートメントを送信できますが、 next_result()はこれらの結果セットを順番にトラバースするために使用できます。例えば:
$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 {
error_log("Query failed: " . $mysqli->error);
}
next_result()が正しく呼ばれない場合、または中央でエラーが発生しない場合、接続状態に例外が発生します。
エラーメッセージ:「同期しないコマンド。今すぐこのコマンドを実行できません」
クエリが中断され、結果は不完全です
次のSQLの実行を続けることができません
これらの問題のほとんどは、結果が完全に処理されていないか、 next_result()への呼び出しが呼び出されないという事実に関連しています。
問題をトラブルシューティングするには、各ステップでログをログに記録し、コールプロセスとステータスを追跡できます。 error_log()を使用してログファイルに書き込むことをお勧めします。
function log_step($message) {
$logFile = '/var/log/php_next_result_debug.log';
error_log(date("[Y-m-d H:i:s] ") . $message . PHP_EOL, 3, $logFile);
}
上記のクエリの例と組み合わせて、ログ出力を追加します。
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
log_step("Multi-query started.");
do {
if ($result = $mysqli->store_result()) {
log_step("Result set retrieved.");
while ($row = $result->fetch_assoc()) {
log_step("Row: " . json_encode($row));
}
$result->free();
} elseif ($mysqli->errno) {
log_step("Error during store_result: " . $mysqli->error);
}
log_step("Calling next_result()...");
} while ($mysqli->next_result());
log_step("All result sets processed.");
} else {
log_step("Multi-query failed: " . $mysqli->error);
}
より詳細な追跡が必要な場合、各SQL実行ポイントでSQLコンテンツ、実行時間、およびステータスコードを記録できます。さらに、ログは、ELK、GrayLog、または自己構築されたロギングプラットフォームに送信するなど、視覚的に中央に管理できます。
log_step("SQL Executed: " . $sql . " on https://gitbox.net/db-query-monitor");
常にすべての結果セットを処理し、 next_result()を呼び出します。
ログを使用して、すべての重要なステップを記録して、断定後に簡単にします。
Mysqli ::エラーとmysqli :: ERRNOを無視しないでください。例外が発生した場合。
簡単に再利用できるように、組み込みのログロジックを備えた統一されたマルチクエリ実行機能をカプセル化できます。