Невозможно вернуть набор результатов в данном контексте
-
05-07-2019 - |
Вопрос
Когда я когда-либо пытаюсь вызвать процедуру хранилища в MySQL, которая отправляет обратно набор результатов, он продолжает говорить мне, что «невозможно вернуть набор результатов в данном контексте».
Я погуглил, и некоторые сказали, что это ошибка MySQL, некоторые сказали, что вам следует сменить драйвер mysqli и...
Ситуация:
Использование библиотеки клиентского API драйвера mysqli версии 5.0.51a, PHP версии 5.2.4-2ubuntu5.6, использование адаптера Zend 1.9 RC 1 Mysqli.
Что я должен делать!?
Решение
Не уверен, что это решение вашей проблемы, но как насчет того, чтобы попробовать более свежую версию PHP?
PHP 5.2.4 определенно довольно старый - так что, если это ошибка в драйвере mysqli PHP, ее могли бы исправить, поскольку...
На самом деле, после быстрого поиска кажется, что проблема, подобная той, свидетелем которой вы являетесь, возникла между PHP 5.2.3 и PHP 5.2.4 (и все еще присутствовала в PHP 5.2.5).
Видеть ошибка №42548:ПРОЦЕДУРА xxx не может вернуть набор результатов в данном контексте (работает в 5.2.3!!)
Можете ли вы протестировать что-то вроде PHP 5.2.9 или 5.2.10?
Я знаю, что они не предусмотрены Ubuntu даже в последней стабильной версии Ubuntu :-( Возможно, вам придется скомпилировать из исходников :-(
Еще одна идея — попробовать адаптер PDO_MySql:может, с этим сработает?
Возможно ли заменить адаптер, не создавая особых проблем или не тратя часы на тестирование?
Поскольку вы работаете с Zend Framework 1.9, вот еще один пост, который может вас заинтересовать и который, возможно, будет проще протестировать: ошибка хранимой процедуры после обновления до 1.8
Простое решение — вернуться к Zend Framework 1.7;можно ли просто проверить?
В любом случае...Удачи !
И, если найдете решение, не забудьте указать, в чем была проблема и как вы ее решили ;-)
Другие советы
Ответ - обновить ваш php, я только что обновил свой до 5.3.0, и он работает как Candy! Р>
У меня недавно была эта проблема по контракту. Клиент использовал кодовую базу на windoze и php 5.2.6, и моя установка была linux и php 5.3.1. Что бы мы ни делали, они не стали бы сотрудничать, поэтому в итоге они дали мне машину windoze vista, и мы установили php 5.2 .6 и мы поехали. Мораль истории: совпадение версий имеет значение. Странно, у меня никогда не было этого на любой другой работе. Но ты не можешь знать все. Совершенно определенно не проблема MySql, просто PHP.
Он также отлично работает с PHP 5.2.10.
В более ранней версии я успешно использовал mysqli :: multi_query для вызова проблемной процедуры и получения правильных результатов.
Я знаю, что этот вопрос старый, но для тех, кто все еще работает с 5.2.4 и получает эту ошибку, вы можете рассмотреть возможность создания нового объекта PDO mysql, чтобы обойти эту проблему.
Я до сих пор использую версию 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);
}