指定されたコンテキストで結果セットを返すことはできません
-
05-07-2019 - |
質問
mysqlで結果セットを返すストアプロシージャを呼び出そうとすると、「指定されたコンテキストでは結果セットを返すことができません」と言われ続けます。
グーグルで調べたところ、mysqlのバグだと言う人もいれば、mysqliドライバを変更する必要があると言う人もいました....
状況:
mysqliドライバークライアントAPIライブラリバージョン5.0.51a、PHPバージョン5.2.4-2ubuntu5.6の使用、Zend 1.9 RC 1 Mysqliアダプターの使用。
どうすればいいですか?
解決
これがあなたの問題の解決策であるかどうかはわかりませんが、最新バージョンのPHPを試してみてはどうでしょうか?
PHP 5.2.4は非常に古いため、PHPのmysqliドライバーのバグである場合は、修正されている可能性があります...
実際、クイック検索の後、PHP 5.2.3とPHP 5.2.4の間で目撃しているような問題が発生しているようです(PHP 5.2.5でも存在していました)。
バグ#42548を参照:PROCEDURE xxxが指定された結果セットを返せないコンテキスト(5.2.3で動作!!!!)
PHP 5.2.9または5.2.10のようなものでテストできますか?
これらはUbuntuによって提供されていないことはわかっています。Ubuntuの最新の安定版でも:-(ソースからコンパイルする必要があるかもしれません:-(
さらに別のアイデアは、mith PDO_MySqlアダプターを試すことです:多分それはそれで動作するでしょうか?
トラブルをあまり引き起こさずに、またはテストに時間をかけることなく、アダプターを変更できる可能性がありますか?
Zend Framework 1.9を使用しているときに、興味があり、テストしやすい別の投稿を以下に示します。 1.8へのアップグレード後のストアドプロシージャエラー
これを試す簡単な解決策は、Zend Framework 1.7に戻ることです。あなたはテストするだけで可能ですか?
とにかく...がんばって!
そして、解決策を見つけたら、問題の内容と解決方法を示すことを忘れないでください;-)
他のヒント
答えはあなたのphpをアップグレードすることです、私はちょうど私のものを5.3.0にアップグレードしました、そしてそれはキャンディのような作品です!
最近、契約でこの問題が発生しました。クライアントはwindozeとphp 5.2.6でコードベースを使用しており、私のインストールはlinuxとphp 5.3.1でしたが、何もしなかったので協力しませんでした。 .6そしてオフに行きました。物語の教訓:バージョンの一致数。他の仕事でこれまで経験したことのない奇妙な話。しかし、ちょっと、すべてを知ることはできません。間違いなくMySqlの問題ではなく、PHPだけです。
PHP 5.2.10でも完全に動作します。
以前のバージョンでは、mysqli :: multi_queryを使用して問題のあるプロシージャを呼び出し、正しい結果を取得しました。
この質問は古くから知っていますが、まだ5.2.4で作業してこのエラーが発生する場合は、この問題を回避するために新しいmysql PDOオブジェクトを作成することを検討してください。
開発中のWordPressプラグインの下位互換性を確保するために、開発サーバーで5.2.4を使用しています。
Belowは、通常エラーが発生する5.2.4(開発サーバーで実行)と、実稼働サーバー(実行しない新しいバージョンを実行する)の両方でプロシージャを正常に呼び出すために使用する手続き呼び出しのラッパーです。エラーは発生しません)。
WordPress固有ですが、ストレートphpを使用して変更することは難しくありません。
/*
* Need to cache connection so we don't keep creating connections till we hit max.
*/
private この質問は古くから知っていますが、まだ5.2.4で作業してこのエラーが発生する場合は、この問題を回避するために新しいmysql PDOオブジェクトを作成することを検討してください。
開発中のWordPressプラグインの下位互換性を確保するために、開発サーバーで5.2.4を使用しています。
Belowは、通常エラーが発生する5.2.4(開発サーバーで実行)と、実稼働サーバー(実行しない新しいバージョンを実行する)の両方でプロシージャを正常に呼び出すために使用する手続き呼び出しのラッパーです。エラーは発生しません)。
WordPress固有ですが、ストレートphpを使用して変更することは難しくありません。
<*>dbhCache=null;
/**
* mySQL Call Proc
*
* Provides a wrapper around calling a mySQL stored procedure to ensure against a 5.2.4 bug that
* causes procedure calls to fail.
* Error:'can't return a result set in the given context'
*
* references:
* http://stackoverflow.com/questions/1200193/cant-return-a-result-set-in-the-given-context
* http://php.net/pdo_mysql#69592 //i got empty result set but pointed me in the right direction
* http://php.net/pdo_mysql#80306 //this worked, but returned 0-indexed and assoc, i edited it so it only returns assoc mimicking $wpdb->get_results(
* http://www.php.net/manual/en/pdo.connections.php
* http://www.php.net/manual/en/pdostatement.fetch.php explains about FETCH_ASSOC
*
* @param string $proc The mySQL stored procedure string, including paramaters, but without the call statement. e.g.: "my_procedure_name('my_paramater')";
* @return string The results of the procedure call
*/
public function mySQLCallProc( $proc ) {
global $wpdb;
$query = "call $proc";
try {
/*
* Attempt to call the procedure normally.
*
*/
$query_result = $wpdb->get_results( $query, ARRAY_A );
/*
* Check for a database error
* and throw an exception if one is found.
* We can then attempt it again using a workaround.
*/
if ( $wpdb->last_error !== '' ) {
throw new Exception( 'Database Error While Calling Procedure' );
}
} catch ( Exception $e ) {
try {
/*
* Create a PDO Object for the connection
*/
if ( is_null($this->_dbhCache)) {
$dbh = new PDO( 'mysql:host=' . DB_HOST . ';port=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASSWORD, array( PDO::ATTR_PERSISTENT => true ) );
$this->_dbhCache=$dbh ;
}else{
$dbh = $this->_dbhCache;
}
/*
* Prepare and call the procedure.
*/
$stmt = $dbh->prepare( "call $proc" );
$stmt->execute();
/*
* fetch all rows into an associative array.
*/
$query_result = $stmt->fetchAll( PDO::FETCH_ASSOC ); //FETCH_ASSOC gets results as an assoc array. without it, you'll receive both assoc and 0-indexed array
} catch ( PDOException $e ) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}
return ($query_result);
}