- 締切済み
PHP+MYSQLのストアドプロシージャでエラー
PHP+MySQL+PDOでストアドプロシージャを2回実行すると 「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」 のエラーが発生します。 いろいろ調べたのですが、回避方法が分かりません。 どなたか、お分かりの方がいらっしゃいましたら、ご教授下さい。 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- mpro-gram
- ベストアンサー率74% (170/228)
補足へのお返事遅くなりましたが、同じprocedure を2回ではないのですね。2回目っていうより、CALL GetMessage() で、返ってくる中身の問題のような気がします。 select 文一つなら、問題ないですけど、2つのselect文を発行していて、カラムリストが異なるとPDO側で受け取れないんじゃなかったかな? phpやMySQLの version にもよるのかもしれません。php5.2.4 の時は、エラーだった気がするけど、php5.3.0 , MySQL5.1.41 で2つのselect文を発行するprocedureのcallを実験したら、エラーにはならないけど、2つ目のselect文内容は受け取れませでした。 あんまり、原因解明にならなくてすみません。
- mpro-gram
- ベストアンサー率74% (170/228)
2回実行って、query($sql) メソッドを続けて2回実行という意味ですか? 2回目の queryメソッド実行前に、「前回得られたデータを全部 fetchall() で取り出しておけ」というメッセージのように読みとれるんですが? それとも一回のqueryメソッド実行時に、2行のSQL文を入れたのでしょうか?クエリの発行を2回に分けて、おのおのfetchall()で取り出すしかないかと思いますけど?
補足
ありがとうございます。 2回目のfatchをする前にエラーが返ります。また、1回目のfatchはfatchallで取り出しています。 説明不足でした。具体的なロジックは以下の通りです。 //1回目のストアド //PDO ストアド実行 $sth = $dbo->prepare('CALL login(?,?)'); $sth->bindParam(1,$UserId, PDO::PARAM_STR,10); $sth->bindParam(2,$Pasword, PDO::PARAM_STR,128); $sth->execute(); //ストアドから結果を取り出す $row = $sth->fetchAll(); $sth->closeCursor(); //2回目のストアド //PDO メッセージ取得ストアド実行 $next_sth = $dbo->prepare('CALL GetMessage()'); $next_sth->execute(); --ここでエラーが返ります //ストアドから結果を取り出す $MessageRow = $sth->fetchAll(); $next_sth->closeCursor(); 以上。宜しくお願い致します。
補足
ありがろうございます。 GetMessage()のSelect文は一つです。 問題はversionかも知れませんね。 ちなみに、現象が発生しているVersionはPHPが5.2.9、MySqlが5.1.33でversionを上げれば解決するかも知れませんが、私が使用しているレンタルサーバの各versionが、現象が出ているものより下なのでprocedureを使用するのを、あきらめます。 いろいろ、ご回答頂きありがとうございました。