Pergunta

Sempre que tento ligar para o procedimento da loja no MySQL que envia um conjunto de resultados, ele continua dizendo que "não pode retornar um conjunto de resultados no contexto especificado".

Eu pesquise no Google e alguns disseram que é MySQL Bug, alguns disseram que você deveria mudar seu driver MySQLI e ....

Situação:

Usando o MySQLI Driver Client API Library Versão 5.0.51a, PHP Versão 5.2.4-2Buntu5.6, usando o Zend 1.9 RC 1 Adaptador MySQLI.

O que devo fazer!?

Foi útil?

Solução

Não tenho certeza se essa é a solução para o seu problema, mas que tal tentar com uma versão mais recente do PHP?
O PHP 5.2.4 é definitivamente bastante antigo - então, se for um bug no driver MySQLI do PHP, ele pode ter sido corrigido desde ...

Na verdade, após uma pesquisa rápida, parece um problema como o que você está testemunhando foi introduzido entre o PHP 5.2.3 e o Php 5.2.4 (e ainda estava aqui no Php 5.2.5).
Ver Bug #42548: Procedimento XXX Não pode retornar um conjunto de resultados no contexto especificado (funciona em 5.2.3 !!)

Você pode testar com algo como Php 5.2.9 ou 5.2.10?
Eu sei que estes não são fornecidos pelo Ubuntu, mesmo na última versão estável do Ubuntu :-( Você pode ter que compilar de fontes :-(


Mais uma idéia seria experimentar o adaptador Mith PDO_MYSQL: talvez funcionasse com esse?
Pode ser possível alterar o adaptador sem causar muitos problemas / sem levar horas para testar?


Enquanto você trabalha com o Zend Framework 1.9, aqui está outro post que pode lhe interessar e pode ser mais fácil testar: Erro de procedimento armazenado após atualização para 1.8

Uma solução fácil de experimentar seria voltar ao Zend Framework 1.7; Seria possível para você, apenas para testar?


De qualquer forma, boa sorte !
E, se você encontrar a solução, não se esqueça de indicar qual era o problema e como você resolveu ;-)

Outras dicas

A resposta é atualizar seu PHP, acabei de atualizar a minha para 5.3.0, e seu trabalho gosta de doces!

Eu tive esse problema recentemente em um contrato. O cliente estava usando uma base de código no Wincoze e Php 5.2.6 e minha instalação foi Linux e Php 5.3.1 O que fizemos, eles não cooperariam, então, no final, eles me deram uma máquina de vista de windoze e instalamos o PHP 5.2 .6 E lá fomos. Moral da história: a versão correspondente da versão conta. Estranho, eu nunca tive isso antes em nenhum outro trabalho. Mas ei, você não pode saber tudo. Definitivamente, não é um problema do MySQL, apenas PHP.

Funciona perfeitamente com o PHP 5.2.10 também.

De uma versão anterior, usei com sucesso o mysqli :: multi_query para chamar um procedimento problemático e obter os resultados certos.

Sei que essa pergunta é antiga, mas para aqueles que ainda trabalham com 5.2.4 e recebem esse erro, você pode criar um novo objeto MySQL PDO para contornar esse problema.

Ainda uso 5.2.4 no meu servidor de desenvolvimento para garantir a compatibilidade com versões anteriores para os plugins do WordPress que desenvolvo.

Abaixo está um invólucro em torno de chamadas processuais que eu uso para chamar os procedimentos com êxito em ambos 5.2.4 (executado no meu servidor de desenvolvimento), o que normalmente me daria o erro, e meu servidor de produção (que executa uma versão mais recente que não dá o erro) .

Seu WordPress específico, mas não seria difícil modificá -lo usando PHP reto.

/*
* 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);


    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top