dポイントプレゼントキャンペーン実施中!

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」
のエラーが発生します。
いろいろ調べたのですが、回避方法が分かりません。
どなたか、お分かりの方がいらっしゃいましたら、ご教授下さい。
宜しくお願い致します。

A 回答 (2件)

補足へのお返事遅くなりましたが、同じ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文内容は受け取れませでした。
あんまり、原因解明にならなくてすみません。

この回答への補足

ありがろうございます。

GetMessage()のSelect文は一つです。
問題はversionかも知れませんね。
ちなみに、現象が発生しているVersionはPHPが5.2.9、MySqlが5.1.33でversionを上げれば解決するかも知れませんが、私が使用しているレンタルサーバの各versionが、現象が出ているものより下なのでprocedureを使用するのを、あきらめます。

いろいろ、ご回答頂きありがとうございました。

補足日時:2012/01/04 10:23
    • good
    • 0

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();

以上。宜しくお願い致します。

補足日時:2011/12/25 11:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!