MySQL クエリを同時に実行しようとすると、「コマンドが同期していない」エラーが発生する場合があります。これは、新しいクエリを実行しようとしているときに、進行中のクエリからフェッチする行がまだあることを MySQL クライアントが検出したときに発生します。
MySQL クライアントは、すべての行を要求します。新しいクエリを開始する前に、クエリから取得する必要があります。これにより、データの破損が防止され、クライアントの状態がサーバーの状態と同期された状態が維持されます。
1.結果の事前取得
mysqli_store_result() を使用して、外部クエリからすべての行を取得できます。これにより、結果をバッファリングするように MySQL クライアントに指示され、後続のクエリを干渉なしに実行できるようになります。
2.すべての結果をフェッチ
または、完全な結果セットを PHP 配列として返す mysqli_result::fetch_all() を利用することもできます。これにより、それ以上のクエリを実行することなく、配列を反復処理できるようになります。
ストアド プロシージャは、それぞれが独自の行を持つ複数の結果セットを返すことができます。このシナリオに対処するには、mysqli_multi_query() を使用する必要があります。このメソッドはストアド プロシージャを開始し、mysqli_next_result() の使用がなくなるまでその結果セットをループします。
フラット テーブルで階層データが表現されているシナリオの場合、クエリを簡素化するために、別のデータ モデリング アプローチの使用を検討してください。
CodeIgnitor 3.0.3 を使用していてこのエラーが発生した場合の回避策は、mysqli_driver.php ファイルにあります。具体的には、262 行目で、_execute() メソッドを次のように変更します。
protected function _execute($sql) { $results = $this->conn_id->query($this->_prep_query($sql)); @mysqli_next_result($this->conn_id); // Fix 'command out of sync' error return $results; }
以上がMySQLi コードで「コマンドが同期していない」エラーが生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。