Невозможно вернуть набор результатов в данном контексте - PullRequest
8 голосов
/ 29 июля 2009

Всякий раз, когда я пытаюсь вызвать хранимую процедуру в mysql, которая отправляет обратно набор результатов, он все время говорит мне, что «не может вернуть набор результатов в данном контексте».

Я гуглю это, и некоторые говорят, что это ошибка MySQL, некоторые говорят, что вы должны изменить свой драйвер MySQL и ....

Ситуация:

Использование драйвера mysqli Client Client Library версии 5.0.51a, PHP версии 5.2.4-2ubuntu5.6, Использование адаптера Zend 1.9 RC 1 Mysqli.

Что мне делать!?

Ответы [ 5 ]

5 голосов
/ 30 июля 2009

Ответ - обновить ваш php, я только что обновил свой до 5.3.0, и он работает как Candy!

1 голос
/ 02 июля 2010

Отлично работает и с PHP 5.2.10.

В более ранней версии я успешно использовал mysqli :: multi_query для вызова проблемной процедуры и получения правильных результатов.

1 голос
/ 27 февраля 2010

У меня недавно была эта проблема по контракту. Клиент использовал кодовую базу на windoze и php 5.2.6, и моя установка была linux и php 5.3.1. Что бы мы ни делали, они не стали бы сотрудничать, поэтому в итоге они дали мне машину windoze vista, и мы установили php 5.2 .6 и мы поехали. Мораль истории: совпадение версий имеет значение. Странно, у меня никогда не было этого на любой другой работе. Но ты не можешь знать все. Совершенно определенно не проблема MySql, просто PHP.

1 голос
/ 29 июля 2009

Не уверен, что это решение вашей проблемы, но что делать с более поздней версией PHP?
PHP 5.2.4 определенно довольно старый - поэтому, если это ошибка в драйвере 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 Framework 1.9, вот еще один пост, который может вас заинтересовать и который может быть проще протестировать: ошибка хранимой процедуры после обновления до 1.8

Простое решение, которое можно попробовать, это вернуться к Zend Framework 1.7; было бы возможно для вас, просто чтобы проверить?


Во всяком случае ... Удачи!
И, если вы найдете решение, не забудьте указать, в чем заключалась проблема и как вы ее решили; -)

0 голосов
/ 13 февраля 2014

Я знаю, что этот вопрос древний, но для тех, кто все еще работает с 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:
     * /839482/nevozmozhno-vernut-nabor-rezultatov-v-dannom-kontekste
     * 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);


    }
...