Domanda

Ogni volta che provo a chiamare la procedura di archivio in mysql che restituisce un set di risultati, continua a dirmi che "non è possibile restituire un set di risultati nel contesto dato".

L'ho google e alcuni hanno detto che è un bug mysql, alcuni hanno detto che dovresti cambiare il tuo driver mysqli e ....

Situazione:

Uso del driver mysqli Libreria API client versione 5.0.51a, versione PHP 5.2.4-2ubuntu5.6, utilizzo dell'adattatore Mysqli Zend 1.9 RC 1.

Cosa devo fare !?

È stato utile?

Soluzione

Non sei 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 è decisamente piuttosto vecchio, quindi, se si tratta di un bug nel driver mysqli di PHP, potrebbe essere stato corretto da ...

In realtà, dopo una rapida ricerca, sembra che un problema come quello a cui stai assistendo sia stato introdotto tra PHP 5.2.3 e PHP 5.2.4 (ed era ancora qui in PHP 5.2.5).
Vedi bug # 42548: PROCEDURA xxx non può restituire un set di risultati nel dato contesto (funziona in 5.2.3 !!)

Sei in grado di provare 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 da fonti :-(


Un'altra idea sarebbe quella di provare con l'adattatore PDO_MySql: forse funzionerebbe con quello?
Potrebbe essere possibile cambiare Adapter senza causare troppi problemi / senza impiegare ore per testarlo?


Mentre lavori con Zend Framework 1.9, ecco un altro post che potrebbe interessarti e potrebbe essere più semplice testare: errore della procedura memorizzata dopo l'aggiornamento a 1.8

Una soluzione semplice 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 l'hai risolto ;-)

Altri suggerimenti

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

Di recente ho avuto questo problema con un contratto. Il client stava usando una base di codice su windoze e php 5.2.6 e la mia installazione era linux e php 5.3.1 Qualunque cosa facessimo, non avrebbero collaborato, quindi alla fine mi hanno dato una macchina windoze vista e abbiamo installato php 5.2 .6 e via siamo partiti. Morale della storia: la corrispondenza della versione conta. Cus strano che non avevo mai avuto prima in nessun altro lavoro. Ma hey, non puoi sapere tutto. Sicuramente non è un problema di MySql, solo PHP.

Funziona perfettamente anche con PHP 5.2.10.

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

So che questa domanda è antica, ma per coloro che lavorano ancora con 5.2.4 e ottengono questo errore, potresti prendere in considerazione la creazione di un nuovo oggetto mysql PDO per aggirare questo problema.

Uso ancora 5.2.4 sul mio server di sviluppo per garantire la retrocompatibilità per i plugin di WordPress che sviluppo.

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

È specifico per WordPress, ma non sarebbe difficile modificarlo usando php diretto.

/*
* Need to cache connection so we don't keep creating connections till we hit max.
*/

private 

So che questa domanda è antica, ma per coloro che lavorano ancora con 5.2.4 e ottengono questo errore, potresti prendere in considerazione la creazione di un nuovo oggetto mysql PDO per aggirare questo problema.

Uso ancora 5.2.4 sul mio server di sviluppo per garantire la retrocompatibilità per i plugin di WordPress che sviluppo.

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

È specifico per WordPress, ma non sarebbe difficile modificarlo usando php diretto.

<*>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); }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top