不能返回给定范围内的结果集(Can't return a result set in the

2019-06-17 18:57发布

当过我尝试调用MySQL中存储过程发送回一个结果集,它口口声声说我说“不能返回在给定范围内的结果集”。

我有谷歌,有的说这是MySQL的错误,也有人说你应该改变你的mysqli驱动程序和....

现状:

使用mysqli的驱动器客户端API库版本5.0.51a,PHP版本5.2.4-2ubuntu5.6,使用Zend 1.9 RC 1周的mysqli适配器。

我该怎么办!?

Answer 1:

不知道这是解决你的问题,而是一个较新版本的PHP的尝试呢?
PHP 5.2.4是definitly很老 - 所以,如果它在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框架1.9的工作,这里的另一篇文章你可能感兴趣,并且可能会更容易测试: 升级到1.8后存储过程的错误

一个简单的解决方案,尝试将回到Zend框架1.7; 有可能对你来说,只是为了测试?


反正...祝你好运!
而且,如果你找到解决办法,不要忘记指出的问题是什么,以及如何解决它;-)



Answer 2:

答案是升级你的php,我刚刚升级矿山5.3.0,和它的作品喜欢的糖果!



Answer 3:

我最近有一个合同这个问题。 客户端使用的windoze和PHP 5.2.6代码库和我安装了Linux和PHP 5.3.1无论我们做,他们不会因此他们给了我一个windoze Vista的机器结束合作,我们安装了PHP 5.2 0.6和我们就出发了。 这个故事告诉我们:版本匹配计数。 奇怪CUS我从来没有在任何其他工作之前,曾经有过这一点。 但是,嘿,你不可能什么都知道。 很绝对不是一个MySQL的问题,只是PHP。



Answer 4:

它与PHP 5.2.10完美的作品也是如此。

从较早的版本,我已经成功地使用的mysqli :: multi_query调用问题的程序,并得到正确的结果。



Answer 5:

我知道这个问题是古老的,但对于那些仍与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);


    }


文章来源: Can't return a result set in the given context