next_result()は、データベースマルチクエリ操作にPHPのmysqli拡張機能を使用する場合に重要な関数です。ストアドプロシージャの後に複数の結果セットを処理するか、複数のSQLステートメントを一度に送信するために使用されます。ただし、多くの開発者は、next_result()を使用するときに詳細を無視しています: next_result()を呼び出す前に、深刻な問題を引き起こす可能性があります。
mysqli :: multi_query()を使用して複数のSQLステートメントを実行すると、各ステートメントは結果セットを返すことができます。 store_result()またはuse_result()を使用して現在の結果セットを処理し、 next_result()を使用して次の結果セットに移動する必要があります。
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM products;";
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());
}
MySqli :: next_result()は、現在の結果セットがクリアまたはリリースされている限り機能します。 store_result()またはfree()ステップをスキップすると、 next_result()を次の結果セットに正しく移動できないため、その後のクエリ結果が処理されません。
これが最も一般的なエラーメッセージです。
Commands out of sync; you can't run this command now
このエラーは、現在の結果セットを処理する前に新しいクエリを実行したり、次の結果セットにアクセスしようとするなど、MySQLで操作の誤った順序があることを意味します。
PHPのゴミ収集メカニズムは、通常、大量のデータボリュームまたは長い接続シナリオでリソースを自動的に処理できますが、現在の結果セットが手動で無料でない場合、メモリ成長が遅くなる可能性があり、最終的にアプリケーションのパフォーマンスに影響します。
常にstore_result()とfree()を呼び出してください。現在の結果は時間に設定されています。
クリアループ構造を使用して、各結果セットがきれいに処理されるようにします。
各ステップのエラーチェックを追加して、論理的なミスを避けます。
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// 処理結果
$result->free();
} else {
if ($mysqli->errno) {
echo "クエリに失敗しました: " . $mysqli->error . "<br>";
}
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
Multi_Query()およびnext_result()を使用する場合、必ず次の結果を覚えておいてください。次の結果をリクエストする前に、データベースとよくやり取りするための基本的なエチケットです。それ以外の場合、 Gitbox.netのバグ提出システムに、多くの不可解な「同期のないコマンド」エラーがすぐに表示される場合があります。