2012-07-15 6 views
6

を、私はこの質問を何度も頼まれましたが、私は多数の質問に対する答えを読んだし、まだ私は、このエラーが発生します理由を理解することはできません知っている:。PDO "キャッチされない例外 'PDOException' ..バッファされていない他のクエリがアクティブな間にクエリを実行できません。 PDOStatementに使用を検討してください:: fetchAllの()「

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.'

最初に奇妙なのは、自分のlocalhost(wampserver)でエラーが出ないということですが、私はそれをWebサーバーで取得します。私のlocalhost上のPHPバージョンは5.3.10で、私のWebサーバー上では5.3.13です。

このエラーの原因は、以前のクエリからバッファにデータが残っているときにクエリを実行していることです。これは私の場合ではありません - 私はすべてのデータをecho'dして、私はクエリで返されたすべての行がフェッチされているという事実を知っています。そうは言って

は、私が代わりにfetch修正問題のfetchAllに私のクエリのいずれかを変更することを発見したが、私は返される行のすべてが読まれていることをを知っので、それは単に何以来行うものではありません。クエリにfetchAllを使用したとき(ループ内で作成されている)、配列ごとにループが出力され、ループ内の各クエリに対して配列内に1つのアイテムしか存在しませんでした。

もう1つの情報。私がfetchAllに変更したクエリではなく(PDOエラーをスローする)、後でエラーをスローするPHPファイルの別のクエリがあります。私のファイルは基本的に次のようなものです:

... code ... 

query 1 

... code ... 

loop 
query 2 
end loop 

... code ... 

query 3 

質問3をコメントアウトしてもエラーはありません。コメントアウトするか、fetchAll、クエリ2に変更するとエラーは発生しません。クエリ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のバグ?

答えて

1

ローのフェッチが失敗するまでフェッチする必要があります。結果セットに1つのローしかなく、1つのフェッチで十分だと思いますが、そうではありません。

おそらく、フェッチが失敗するまで完全に「フェッチしない」という別のステートメントがあります。はい、フェッチがのステートメントで失敗するまでフェッチすることがわかります。

また、日のため、この問題に苦しんでた後CLOSECURSOR()

$sql = "select * from test.a limit 1"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array()); 
$row = $stmt->fetch(); 
$stmt->closeCursor(); 

または

$sql = "select * from test.a limit 1"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array()); 
list($row) = $stmt->fetchAll(); //tricky 
+0

だけに私が理解していることを確認してください。返される行は1つだけですが、実際には複数回フェッチする必要があります。これを行うにはclosecursor()を使用するのが好ましいですか?ありがとう。 – Nate

+0

thats correct。はい、closecursor()が好きです – goat

+0

あなたの助けをありがとう。だから、私はそれを得ることを確認するために、execute()を呼び出すたびにclosecursor()を呼び出しますか? – Nate

2

を参照してください、私は最終的に、これは私のために働いていたことがわかった:

$db = new PDO ($cnstring, $user, $pwd); 
$db->setAttribute (PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);