この質問が何度も寄せられていることは知っていますが、多くの質問への回答を読んでも、このエラーが表示される理由を理解できません。
致命的なエラー: キャッチされない例外 'PDOException' とメッセージ 'SQLSTATE[HY000]: 一般エラー: 2014 他のバッファリングされていないクエリがアクティブな間はクエリを実行できません。PDOStatement::fetchAll() の使用を検討してください。または、コードが mysql に対してのみ実行される場合は、PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性を設定して、クエリのバッファリングを有効にすることができます。
最初に奇妙な点は、ローカルホスト (wampserver) ではエラーが発生しないのに、Web サーバーではエラーが発生することです。私のローカルホストの PHP バージョンは 5.3.10 で、Web サーバーのバージョンは 5.3.13 です。
このエラーの原因は、前のクエリからバッファにデータが残っているときにクエリを作成していることです。これは私には当てはまりません。すべてのデータをエコーアウトしましたが、クエリで返されたすべての行がフェッチされていることを知っています。
そうは言っても、クエリの 1 つをfetchAll
代わりに変更fetch
することで問題が解決することがわかりましたが、返されたすべての行が読み取られていることがわかっているため、問題は解決しません。クエリに使用fetchAll
したとき(ループで作成されている)、ループごとに配列を出力しましたが、ループ内の各クエリの配列には1つのアイテムしかありませんでした。
もう一つ情報です。PDOエラーをスローするのは、私が変更したfetchAll
(エラーが消える)クエリではありません.phpファイルの後半に、エラーをスローする別のクエリがあります。私のファイルは基本的に次のようなものです:
... code ...
query 1
... code ...
loop
query 2
end loop
... code ...
query 3
クエリ 3 をコメントアウトすると、エラーは発生しません。クエリ 2をコメント アウトするか、に変更するとfetchAll
、エラーは発生しません。クエリ 1 は何の影響もありません。
また、ページ上のすべてのクエリに(同時に)追加しようとしたことも付け加えLIMIT 1
ておきますが、エラーはまだ残っています。これは、バッファに未読データがないことを証明していると思いますよね?
本当に困っていますので、アドバイスよろしくお願いします。誰かが尋ねる前に、このための完全なコードを投稿することはできませんが、ここに私のコードの簡略化されたバージョンがあります:
$stmt = $this->db->prepare('SELECT ... :par LIMIT 1');
makeQuery($stmt, array(':par' => $var));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt = $this->db->prepare('SELECT ... :par LIMIT 1');
for loop
makeQuery($stmt, array(':par' => $var));
$row2 = $stmt->fetch(PDO::FETCH_ASSOC);
... [use row2] ...
end for loop
$stmt = $this->db->prepare('SELECT ... :par LIMIT 1');
makeQuery($stmt, array(':par' => $var));
$row3 = $stmt->fetch(PDO::FETCH_ASSOC);
ここにありmakeQuery()
ます。
/**************************************************************************************************************
* Function: makeQuery *
* Desc: Makes a PDO query. *
* Pre conditions: The statement/query and an array of named parameters (may be empty) must be passed. *
* Post conditions: The PDO query is executed. Exceptions are caught, displayed, and page execution stopped. *
**************************************************************************************************************/
function makeQuery($stmt, $array, $errMsg = '')
{
try
{
$stmt->execute($array);
}
catch (PDOException $e)
{
print $errMsg != ''?$errMsg:"Error!: " . $e->getMessage() . "<br/>";
die();
}
}
ご協力いただきありがとうございます!
編集:クエリ2の後に次のことも試しました(それが問題の原因であるように思われるため:
$row2 = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($row2);
出力は次のとおりです。
bool(false)
PDO のバグに遭遇しましたか?