2017-08-01 2 views
1

、私はPDOを使用してMySQLstored procedureを呼び出すときに、ちょうどこのように、別のPDOのクエリ、:、私はPDOを使用してMySQLのストアドプロシージャ、その後、別のクエリを呼び出すときに、私はエラーを取得する:PHPで

CREATE PROCEDURE `get_token`() 
BEGIN 
    DECLARE token CHAR(64); 
    DECLARE expire SMALLINT; 

    SELECT `token`, `expire` INTO token, expire FROM `token`; 

    SELECT token, expire; 
END$$ 

そして、私は次のエラーメッセージ(それをキャッチするためにtry...catchを使用して)得た:

$dbh = new PDO('mysql:host=localhost;dbname=db1','user1','password1'); 

$query = "CALL get_token()"; 
$stmt = $dbh->query($query); 
$array = $stmt->fetchAll(); 

$query = "SELECT * FROM `table1`"; 
$stmt = $dbh->query($query); 
$array = $stmt->fetchAll(); 

MySQLstored procedure約このようなものです

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.

I(つまりfetchAll()を使用しPDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性設定手段)上記のエラーメッセージで説明されている手順に従った場合でも、私はまだ同じエラーメッセージを得ました。

最初のクエリを通常のSELECT SQLクエリに変更すると、stored procedureではなく、このエラーは発生しません。したがって、問題はstored procedureから発生しているようです。

どうすればこの問題を解決できますか?

+1

エラーメッセージに示唆されたことをやってみましたか? – Mark

+0

エラーメッセージの2つの提案に従っていますが、どちらもうまくいきませんでした。 :-(@マーク – Benson

+0

'$ stmt-> closeCursor()'または 'unset($ stmt)'を使って私があなたに勧めた投稿に記載されている2つの方法を試しましたが、残念なことに、私のために働いています:-(@yiboulex – Benson

答えて

3

これは、最初のクエリのカーソルを解放していないためです。それはまだ別のfetchAllを待つ。

If you do not fetch all of the data in a result set before issuing your next call to PDO::query(), your call may fail. Call PDOStatement::closeCursor() to release the database resources associated with the PDOStatement object before issuing your next call to PDO::query().

http://php.net/manual/en/pdo.query.phpからそう$stmt->closeCursor();最初$array = $stmt->fetchAll();後に十分なものでなければなりません。

+0

ありがとうございました!これを試しましたが、同じエラーメッセージが表示されました '$ dbh-> closeCursor();'は '$ stmt-> closeCursor ); '私は後者を試しましたが、まだ問題は残っています:-(@Mark – Benson

+1

技術的に' fetchAll() 'はバッファを終了させますが、カーソルを閉じるわけではないので、理論上は'closeCursor()'を使用してバッファエラーを防ぐ – DarkMukke

+0

fetchAll()を使用し、 '$ stmt-> closeCursor;を使用したので、なぜこのエラーが発生しましたか?@DarkMukke – Benson

1

彼らはdocumentationによる

を競合としてあなたはPDO::MYSQL_ATTR_USE_BUFFERED_QUERY OR fetchAll() のいずれかを使用する必要があります。つまり

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (integer) If this attribute is set to TRUE on a PDOStatement, the MySQL driver will use the buffered versions of the MySQL API. If you're writing portable code, you should use PDOStatement::fetchAll() instead.

fetchAll()はバッファ を閉じようとしたが

オープンそれを PDO::MYSQL_ATTR_USE_BUFFERED_QUERY続け、
+0

私は両方を試みた。さらに '$ stmt-> closeCursor();'を使用し、 'unset($ stmt);'も使用しました。しかし、彼らのすべては私の問題を解決しませんでした。それはまだ同じです。 – Benson

+1

'unset($ stmt);'は、バッファがmysql apiにあるため動作しません。セッションを閉じても(PHPなどで新しい接続を開いた場合)動作する唯一の方法は – DarkMukke

+0

ありがとう!'$ stmt-> closeCursor();'は動作します。問題は今解決されました。 – Benson

関連する問題