Question

Chaque fois que j'essaie d'appeler une procédure de stockage dans mysql qui renvoie un jeu de résultats, elle me répète que "je ne peux pas retourner un jeu de résultats dans le contexte donné".

Je l'ai sur Google et certains ont dit que c'était un bogue mysql, d'autres ont dit que vous devriez changer votre pilote mysqli et ....

Situation:

Utilisation du pilote mysqli Bibliothèque de l’API cliente version 5.0.51a, PHP version 5.2.4-2ubuntu5.6, utilisation de l’adaptateur Zend 1.9 RC 1 Mysqli.

Que dois-je faire!?

Était-ce utile?

La solution

Vous n'êtes pas sûr que ce soit la solution à votre problème, mais qu'en est-il d'essayer une version plus récente de PHP?
PHP 5.2.4 est définitivement vieux - donc, si c'est un bogue dans le pilote mysqli de PHP, il a peut-être été corrigé depuis ...

En fait, après une recherche rapide, il semble qu'un problème comme celui dont vous êtes témoin ait été introduit entre PHP 5.2.3 et PHP 5.2.4 (et était toujours ici dans PHP 5.2.5).
See bug n ° 42548: la procédure xxx ne peut pas renvoyer un ensemble de résultats dans la donnée contexte (fonctionne en 5.2.3 !!)

Pouvez-vous tester avec quelque chose comme PHP 5.2.9 ou 5.2.10?
Je sais qu’ils ne sont pas fournis par Ubuntu, même dans la dernière version stable d’Ubuntu :-( Vous devrez peut-être compiler à partir de sources: - (

Pourtant, une autre idée serait d’essayer avec l’adaptateur PDO_MySql: peut-être que cela fonctionnerait avec celui-là?
Il serait peut-être possible de changer de carte sans causer trop de problèmes / sans prendre des heures à tester?

Comme vous travaillez avec Zend Framework 1.9, voici un autre article qui pourrait vous intéresser et être plus facile à tester: erreur de procédure stockée après la mise à niveau vers la version 1.8

Une solution facile à essayer serait de revenir à Zend Framework 1.7; serait-il possible pour vous, juste pour tester?


De toute façon bonne chance !
Et si vous trouvez la solution, n'oubliez pas d'indiquer quel était le problème et comment vous l'avez résolu; -)

Autres conseils

La réponse est de mettre à jour votre php, je viens de mettre à jour le mien à la version 5.3.0, et ça marche comme Candy!

J'ai eu ce problème récemment sur un contrat. Le client utilisait une base de code sur windoze et php 5.2.6 et mon installation était linux et php 5.3.1. Peu importe ce que nous faisions, ils ne voulaient pas coopérer. Finalement, ils m'ont donné une machine à venter vista et nous avons installé php 5.2. 0,6 et nous sommes allés. Morale de l'histoire: la correspondance des versions compte. Bizarre, je n'avais jamais eu cela auparavant dans aucun autre travail. Mais bon, vous ne pouvez pas tout savoir. Très certainement pas un problème MySql, juste PHP.

Cela fonctionne également parfaitement avec PHP 5.2.10.

Dans une version antérieure, j'avais utilisé avec succès mysqli :: multi_query pour appeler une procédure problématique et obtenir les bons résultats.

Je sais que cette question est ancienne, mais pour ceux qui travaillent encore avec la 5.2.4 et obtiennent cette erreur, vous pouvez envisager de créer un nouvel objet mysql PDO pour contourner ce problème.

J'utilise toujours la version 5.2.4 sur mon serveur de développement pour assurer la compatibilité descendante des plugins WordPress que je développe.

Vous trouverez ci-dessous un encapsulage des appels de procédure que j'utilise pour appeler des procédures dans les versions 5.2.4 (exécutées sur mon serveur de dev), ce qui me donnerait normalement l'erreur, ainsi que sur mon serveur de production (qui exécute une version plus récente). pas donner l'erreur).

Son spécifique à WordPress, mais il ne serait pas difficile de le modifier en utilisant php directement.

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

private 

Je sais que cette question est ancienne, mais pour ceux qui travaillent encore avec la 5.2.4 et obtiennent cette erreur, vous pouvez envisager de créer un nouvel objet mysql PDO pour contourner ce problème.

J'utilise toujours la version 5.2.4 sur mon serveur de développement pour assurer la compatibilité descendante des plugins WordPress que je développe.

Vous trouverez ci-dessous un encapsulage des appels de procédure que j'utilise pour appeler des procédures dans les versions 5.2.4 (exécutées sur mon serveur de dev), ce qui me donnerait normalement l'erreur, ainsi que sur mon serveur de production (qui exécute une version plus récente). pas donner l'erreur).

Son spécifique à WordPress, mais il ne serait pas difficile de le modifier en utilisant php directement.

<*>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); }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top