ホームページ  >  記事  >  バックエンド開発  >  MySQL エラー 2014: 「他のバッファされていないクエリがアクティブである間はクエリを実行できません」が発生するのはなぜですか?

MySQL エラー 2014: 「他のバッファされていないクエリがアクティブである間はクエリを実行できません」が発生するのはなぜですか?

DDD
DDDオリジナル
2024-11-21 07:10:13174ブラウズ

Why Am I Getting MySQL Error 2014:

MySQL エラー 2014 の原因: 他のバッファされていないクエリがアクティブである間はクエリを実行できません

MySQL エラー 2014 は、バッファされていない別のクエリがまだアクティブであるときにクエリを実行しようとすると発生しますアクティブ。これは、PDO::ATTR_EMULATE_PREPARES を false に設定してプリペアド ステートメントを使用するときに発生する可能性があります。

説明

PDO::ATTR_EMULATE_PREPARES が true の場合、PDO はプリペアド ステートメントを通常の SQL クエリに変換してエミュレートします。これは、サーバーがデータ行ごとにクエリを 1 回実行することを意味し、バッファリングされていないクエリを同時に実行できるようにします。

ただし、PDO::ATTR_EMULATE_PREPARES が false の場合、PDO は準備されたステートメントをサーバーに送信します。そしてカーソルを開いたままにします。これにより、カーソルが閉じるまで他のクエリが実行されなくなります。

解決策

このエラーにはいくつかの解決策があります。

  • バッファされたクエリを有効にします。 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性を使用して、バッファリングを有効にすることができますクエリ。これにより、PDO は後続のクエリを実行する前に、クエリのすべての結果をメモリにフェッチします。
  • ** fetchAll() を使用する: 準備されたステートメントで fetchAll() を呼び出すと、カーソルが閉じられ、他のクエリが実行できるようになります。 .
  • カーソルを閉じる: を使用して、準備されたステートメントのカーソルを明示的に閉じることができます。 closeCursor() メソッド。

追加の考慮事項

提供されたコード スニペットでは、$stmt2 クエリがループ内で複数回実行されるという問題があります。これは不要であり、パフォーマンスを向上させるためにループの外に移動できます。

位置パラメータ (配列を含む PDO::execute()) の代わりに名前付きパラメータ (PDO::bindParam()) を使用することもお勧めします。準備されたステートメントの場合。これにより、コードが読みやすくなり、SQL インジェクションのリスクが軽減されます。

結論

MySQL エラー 2014 は、バッファリングされていないクエリが適切に処理されていないことが原因である可能性があります。バッファされたクエリを使用するか、fetchAll() を呼び出すか、カーソルを閉じることで、このエラーを回避できます。

以上がMySQL エラー 2014: 「他のバッファされていないクエリがアクティブである間はクエリを実行できません」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。