当过我尝试调用MySQL中存储过程发送回一个结果集,它口口声声说我说“不能返回在给定范围内的结果集”。
我有谷歌,有的说这是MySQL的错误,也有人说你应该改变你的mysqli驱动程序和....
现状:
使用mysqli的驱动器客户端API库版本5.0.51a,PHP版本5.2.4-2ubuntu5.6,使用Zend 1.9 RC 1周的mysqli适配器。
我该怎么办!?
当过我尝试调用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是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; 有可能对你来说,只是为了测试?
反正...祝你好运!
而且,如果你找到解决办法,不要忘记指出的问题是什么,以及如何解决它;-)
答案是升级你的php,我刚刚升级矿山5.3.0,和它的作品喜欢的糖果!
我最近有一个合同这个问题。 客户端使用的windoze和PHP 5.2.6代码库和我安装了Linux和PHP 5.3.1无论我们做,他们不会因此他们给了我一个windoze Vista的机器结束合作,我们安装了PHP 5.2 0.6和我们就出发了。 这个故事告诉我们:版本匹配计数。 奇怪CUS我从来没有在任何其他工作之前,曾经有过这一点。 但是,嘿,你不可能什么都知道。 很绝对不是一个MySQL的问题,只是PHP。
它与PHP 5.2.10完美的作品也是如此。
从较早的版本,我已经成功地使用的mysqli :: multi_query调用问题的程序,并得到正确的结果。
我知道这个问题是古老的,但对于那些仍与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);
}