sql >> データベース >  >> RDS >> Mysql

mysqliがコマンドの同期外れエラーを出すのはなぜですか?

    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にアップデートしたばかりで、このハックを新しいバージョンにコピーする必要がありました。



    1. テーブル名の適切な挿入

    2. convert_tzはnullを返します

    3. SQLで、各グループの上位2行を選択する方法

    4. SQLServerをOracleに接続する