Невозможно вернуть набор результатов в данном контексте

StackOverflow https://stackoverflow.com/questions/1200193

Вопрос

Когда я когда-либо пытаюсь вызвать процедуру хранилища в 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);


    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top