2009-07-29 17 views
8

Ogni volta che provo a richiamare la procedura di archiviazione in mysql che restituisce un set di risultati, continua a ripetermi che "non è possibile restituire un set di risultati nel contesto specificato".Impossibile restituire un set di risultati nel contesto specificato

ho google e alcuni dicono che è mysql bug, alcuni hanno detto si dovrebbe cambiare il driver mysqli e ....

Situazione:

Utilizzando mysqli driver client di versione libreria API 5.0.51a, PHP Versione 5.2.4-2ubuntu5.6, Utilizzo di Zend 1.9 RC 1 Adattatore Mysqli.

Cosa devo fare !?

risposta

1

Non sicuro che questa sia la soluzione al tuo problema, ma che ne dici di provare con una versione più recente di PHP?
PHP 5.2.4 è sicuramente abbastanza vecchio - quindi, se si tratta di un bug nel driver di mysqli di PHP, sarebbe stato corretto dal ...

In realtà, dopo una rapida ricerca, sembra un problema come quello si sta assistendo è stato introdotto tra PHP 5.2.3 e PHP 5.2.4 (ed era ancora qui in PHP 5.2.5).
Vedi bug #42548 : PROCEDURE xxx can't return a result set in the given context (works in 5.2.3!!)

Sei in grado di testare qualcosa come PHP 5.2.9 o 5.2.10?
So che questi non sono forniti da Ubuntu, anche nell'ultima versione stabile di Ubuntu :-(Potrebbe essere necessario compilare dai sorgenti :-(


Un'altra idea sarebbe quella di provare adattatore pdo_mysql mito: forse che avrebbe funzionato con quella?
potrebbe essere possibile cambiare l'adattatore senza causare troppi problemi/senza prendere ore per testare?


Come si lavora con Zend Framework 1.9, ecco un altro post che potrebbe interessare tu, e potresti essere più facile da testare: stored procedure error after upgrade to 1.8

Una soluzione facile da provare sarebbe quella di tornare a Zend Framework 1.7; sarebbe possibile per te, solo per testare?


Comunque ... Buona fortuna!
E, se trovi la soluzione, non dimenticare di indicare quale fosse il problema e come lo hai risolto ;-)

+0

Molto molto buoni consigli da parte vostra, grazie per l'accuratezza. – Farid

+0

Potrebbe questo problema tornare in 5.2.17? Sto ottenendo lo stesso errore ma versione successiva di CentOS PHP. – Clutch

+0

Probabilmente qualche altro problema in quanto ho riscontrato problemi simili sulla versione 5.3.1 usando xammp e windows – Sydwell

5

La risposta è aggiornare il tuo php, ho appena aggiornato il mio a 5.3. 0, e funziona come Candy!

+1

Grazie per aver dato la soluzione scelta :-) (Attenzione: usare PHP 5.3 potrebbe portare ad altri problemi altrove nel vostro codice, poiché portare un sacco di roba nuova ^^) –

1

Ho avuto questo problema di recente su un contratto. Il client stava usando un codebase su windoze e php 5.2.6 e la mia installazione era linux e php 5.3.1 Qualunque cosa avessimo fatto, non avrebbero cooperato quindi alla fine mi hanno dato una macchina windoze vista e abbiamo installato php 5.2 .6 e siamo partiti. Morale della trama: la corrispondenza delle versioni conta. Curioso non l'ho mai avuto prima in nessun altro lavoro. Ma hey, non puoi sapere tutto. Molto decisamente non un problema MySql, solo PHP.

+0

Sono stato sconcertato per ottenere questo problema su PHP 5.2.6 quando provavo a distribuire un sistema sviluppato su un server di sviluppo PHP 5.3. Quindi dovrò aggiornare. Si noti che ci sono [problemi di incompatibilità a ritroso] (http://www.php.net/manual/en/migration53.incompatible.php). – Gruber

+0

@Gruber,? Ci sono sempre problemi incompatibili con le versioni precedenti. Cosa c'è di così speciale in quelle versioni? – Pacerier

1

Funziona perfettamente anche con PHP 5.2.10.

Da una versione precedente, ho utilizzato con successo mysqli :: multi_query per chiamare una procedura problematica e ottenere i risultati corretti.

0

So che questa domanda è antica, ma per coloro che stanno ancora lavorando con 5.2.4 e ricevendo questo errore, si può prendere in considerazione la creazione di un nuovo oggetto PDO mysql per ovviare a questo problema.

Uso ancora il 5.2.4 sul mio server di sviluppo per garantire la compatibilità con le versioni precedenti dei plugin WordPress che sviluppo.

Di seguito è riportato un wrapper sulle chiamate procedurali che utilizzo per chiamare correttamente le procedure in entrambi 5.2.4 (eseguito sul mio server di sviluppo), che normalmente mi restituisce l'errore e il mio server di produzione (che esegue una versione più recente che non dà l'errore).

Il suo specifico WordPress, ma non sarebbe difficile modificarlo utilizzando il php diritto.

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


    } 
Problemi correlati