MySQLクライアントでは、進行中のクエリからフェッチする行がまだある場合に、新しいクエリを実行することはできません。 コマンドが同期していない を参照してください。 一般的なエラーに関するMySQLドキュメントで。
mysqli_store_result()
を使用できます
外部クエリからすべての行をプリフェッチします。これにより、MySQLクライアントでそれらがバッファリングされるため、サーバーの観点から、アプリは完全な結果セットをフェッチします。そうすれば、バッファリングされた外部結果セットから行をフェッチするループでも、さらに多くのクエリを実行できます。
または、 mysqli_result ::fetch_all()コード>
これにより、完全な結果セットがPHP配列として返され、その配列をループできます。
ストアドプロシージャは複数の結果セットを返す可能性があるため、ストアドプロシージャの呼び出しは特殊なケースです。各結果セットには、独自の行セットが含まれる場合があります。そのため、@ a1ex07の回答では、 mysqli_multi_query()
の使用について言及しています。 mysqli_next_result()
までループします これ以上の結果セットはありません。これは、ストアドプロシージャに単一の結果セットがある場合でも、MySQLプロトコルを満たすために必要です。
PS:ちなみに、階層を表すデータがあるため、ネストされたクエリを実行しているようです。より簡単にクエリできるように、データを別の方法で保存することを検討することをお勧めします。このタイトルについて、SQLとPHPを使用した階層データのモデル 。このトピックについては、私の本の章でも取り上げています。 SQLアンチパターン:データベースの落とし穴の回避プログラミング 。
mysqli_next_result()
を実装する方法は次のとおりです CodeIgnitor 3.0.3の場合:
system / database / drivers / mysqli / mysqli_driver.php
の262行目 変更
protected function _execute($sql)
{
return $this->conn_id->query($this->_prep_query($sql));
}
これに
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;
}
これは2.x以降の問題です。 3.xにアップデートしたばかりで、このハックを新しいバージョンにコピーする必要がありました。