2009-07-29 4 views
8

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

といくつかは、それが、いくつかは、あなたのmysqliのドライバを変更しなければならないと述べたMySQLのバグだと私はそれをグーグルました....

状況:mysqliのドライバクライアントAPIライブラリのバージョン5.0.51aを使用して

、 PHPバージョン5.2.4-2ubuntu5.6、Zend 1.9 RC 1 Mysqliアダプタの使用。

どうすればいいですか?

答えて

1

これはあなたの問題に対する解決策ではありませんが、より新しいバージョンのPHPで試してみるとどうでしょうか?
PHP 5.2.4は、間違いなくかなり古いです - ので、それはPHPのmysqliのドライバのバグだ場合、それは...

以来修正されている可能性があります実際には、クイック検索の後に、それは1のような問題ですPHP 5.2.3とPHP 5.2.4の間で導入されました(PHP 5.2.5ではまだありません)。
bug #42548 : PROCEDURE xxx can't return a result set in the given context (works in 5.2.3!!)

PHP 5.2.9または5.2.10などでテストできますか?
私もあなたが:-(


ソースからコンパイルする必要がある場合があります:-(最後のUbuntuの安定版ではまだ別のアイデアはmithのPDO_MYSQLアダプタをしようとするだろう、これらはUbuntuので提供されていません知っている:多分それは、そのいずれかで動作するのでしょうか?
それはテストするために時間を取らず/あまりにも多くの問題を引き起こすことなくアダプタを変更することは可能かもしれない?


あなたはZend Frameworkの1.9を使用して作業しているように、ここで興味かもしれない別のポストですあなた、そしてテストするのが簡単かもしれません:stored procedure error after upgrade to 1.8

これを試す簡単な解決策は、Zend Framework 1.7に戻ることです。それはあなたのためだけにテストすることが可能でしょうか?


とにかく...幸運!
解決策が見つかった場合は、問題の内容と解決方法を忘れずにお答えください。

+0

非常に良いアドバイスをいただき、ありがとうございます。 – Farid

+0

この問題は5.2.17に戻ってきますか?同じエラーが出ていますが、CentOS PHPの後のバージョンです。 – Clutch

+0

おそらく私はあなたが選択したソリューションを与えるためxammpや窓 – Sydwell

5

答えはあなたのPHPをアップグレードすることです。私は5.3にアップグレードしました。 0、それはキャンディを好きな作品です!

+1

感謝を使用して、バージョン5.3.1に同様の問題を発見したとして、いくつかの他の問題:-) (ただ、注意してください:PHP 5.3を使用することとして、あなたのコード内の別の場所で他のトラブルにつながる可能性があります新しいものがたくさんあります^^) –

1

最近、契約上この問題が発生しました。クライアントはwindozeとphp 5.2.6でコードベースを使用していましたが、私のインストールはlinuxとphp 5.3.1でした。私たちが何をしても、彼らは協力しないでしょうから、彼らは私にwindoze Vistaマシンを与え、php 5.2 .6我々は行った。物語のモラル:バージョンマッチカウント。奇妙なことに、他の仕事でこれまでにこれまでに経験したことはありませんでした。しかし、ねえ、あなたはすべてを知ることはできません。非常に間違いなくMySqlの問題ではなく、PHP。

+0

PHP 5.3.6で開発されたシステムを展開しようとすると、PHP 5.2.6でこの問題が発生することがありました。だから私はアップグレードする必要があります。 「後方互換性の問題」(http://www.php.net/manual/en/migration53.incompatible.php)があることに注意してください。 – Gruber

+0

@グルーバー、?常に後方互換性の問題があります。これらのバージョンではどうして特別なのでしょうか? – Pacerier

1

これはPHP 5.2.10でも完全に機能します。

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

0

私はこの質問は古代である知っているが、それらはまだ5.2.4での作業と、このエラーを取得するために、あなたはこの問題を回避するために、新しいmysqlのPDOオブジェクトを作成することを検討します。

私はまだ開発のWordPressのプラグインとの下位互換性を確保するために私のdevのサーバー上で5.2.4を使用しています。

以下は、5.2.4(my devサーバーで実行)と通常はエラーが発生するプロシージャーを正常に呼び出すために使用するプロシージャコールのラッパーです。エラーは発生しません)。

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


    } 
関連する問題