Когда когда-либо я пытаюсь вызвать процедуру хранилища в mysql, которая отправляет обратно результирующий набор, он продолжает говорить мне, что «невозможно вернуть набор результатов в данном контексте».
У меня есть google, и некоторые сказали, что это ошибка mysql, некоторые сказали, что вы должны изменить свой драйвер mysqli и …
Ситуация:
Использование библиотеки mysqli Client API версии 5.0.51a, PHP версии 5.2.4-2ubuntu5.6, с использованием адаптера Zend 1.9 RC 1 Mysqli.
Что мне делать!?
Не уверен, что это решение вашей проблемы, но как насчет попытки с более новой версией PHP?
PHP 5.2.4 определенно довольно старый – так что, если это ошибка в драйвере PHP mysqli, возможно, это было исправлено с …
Фактически, после быстрого поиска кажется, что проблема, подобная той, которую вы наблюдаете, была введена между 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 🙁 Возможно, вам придется скомпилировать из источников 🙁
Еще одна идея – попробовать mith 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. Что бы мы ни делали, они не будут сотрудничать, поэтому в конце концов они дали мне машину с виндзозой и мы установили php 5.2 .6 и мы пошли. Мораль истории: количество совпадений версий. Странный cus, я никогда не имел этого никогда в любой другой работе. Но эй, ты не можешь все знать. Очень определенно не проблема MySql, просто PHP.
Он отлично работает с PHP 5.2.10.
Из более ранней версии я успешно использовал mysqli :: multi_query для вызова проблемной процедуры и получения правильных результатов.
Я знаю, что этот вопрос древний, но для тех, кто все еще работает с 5.2.4 и получает эту ошибку, вы можете подумать о создании нового объекта PDO mysql для решения этой проблемы.
Я по-прежнему использую 5.2.4 на своем dev-сервере, чтобы обеспечить обратную совместимость для плагинов WordPress, которые я разрабатываю.
Ниже приведена оболочка процедурных вызовов, которые я использую для успешного вызова процедур как в 5.2.4 (выполняется на моем 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. eg: "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); }