8

結果セットを返す mysql のストア プロシージャを呼び出そうとすると、「指定されたコンテキストで結果セットを返すことはできません」と言い続けます。

私はそれをグーグルで調べましたが、それはmysqlのバグだと言う人もいれば、mysqliドライバーを変更する必要があると言う人もいます....

状況 :

mysqli ドライバーを使用 クライアント API ライブラリ バージョン 5.0.51a、PHP バージョン 5.2.4-2ubuntu5.6、Zend 1.9 RC 1 Mysqli アダプターを使用。

私は何をすべきか!?

4

5 に答える 5

5

答えはあなたのphpをアップグレードすることです、私はちょうど私のものを5.3.0にアップグレードしました、そしてそれはキャンディのように動作します!

于 2009-07-29T22:31:24.807 に答える
1

私は最近契約でこの問題を抱えていました。クライアントはwindozeとphp5.2.6でコードベースを使用していて、私のインストールはlinuxとphp 5.3.1でした。何をしても、それらは連携しなかったので、最終的にはwindoze vistaマシンを提供し、php5.2をインストールしました。 .6そしてオフに行きました。話の教訓:バージョンマッチングが重要です。奇妙なcus私は他の仕事でこれまでこれまでにこれを持っていませんでした。しかしねえ、あなたはすべてを知ることはできません。間違いなくMySqlの問題ではなく、PHPだけです。

于 2010-02-26T22:32:08.700 に答える
1

これが問題の解決策かどうかはわかりませんが、より新しいバージョンのPHPを試してみてはどうでしょうか。
PHP 5.2.4は間違いなくかなり古いので、PHPのmysqliドライバーのバグである場合は、それ以降に修正されている可能性があります...

実際、簡単に検索した後、あなたが目撃しているような問題がPHP5.2.3とPHP5.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にアップグレードした後のストアドプロシージャエラー

それを試す簡単な解決策は、ZendFramework1.7に戻ることです。テストするだけで可能でしょうか?


とにかく...頑張ってください!
そして、あなたが解決策を見つけたら、問題が何であったか、そしてあなたがそれをどのように解決したかを示すことを忘れないでください;-)

于 2009-07-29T16:59:07.430 に答える
1

PHP5.2.10でも完全に機能します。

以前のバージョンから、mysqli :: multi_queryを使用して問題のあるプロシージャを呼び出し、正しい結果を得ることができました。

于 2010-07-02T12:52:30.907 に答える
0

この質問が古いことは承知していますが、まだ 5.2.4 で作業していてこのエラーが発生する場合は、この問題を回避するために新しい mysql PDO オブジェクトを作成することを検討してください。

私は今でも開発サーバーで 5.2.4 を使用して、開発する WordPress プラグインの下位互換性を確保しています。

以下は、通常はエラーが発生する5.2.4(開発サーバーで実行)と本番サーバー(エラーを発生しない新しいバージョンを実行)の両方でプロシージャを正常に呼び出すために使用する手続き呼び出しのラッパーです。エラー) 。

WordPress 固有ですが、そのままの php を使用して変更することは難しくありません。

/*
* Need to cache connection so we don't keep creating connections till we hit max.
*/

private $_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);


    }
于 2014-02-13T14:34:03.050 に答える