2009-07-29 8 views
8

Lorsque j'essaie d'appeler la procédure de stockage dans mysql qui renvoie un jeu de résultats, il ne cesse de me dire que "je ne peux pas retourner un jeu de résultats dans le contexte donné".Impossible de retourner un jeu de résultats dans le contexte

J'ai Google et certains ont dit qu'il bug mysql, certains ont dit que vous devriez changer votre pilote mysqli et ....

Situation:

Utilisation du pilote mysqli version bibliothèque API client 5.0.51a, Version PHP 5.2.4-2ubuntu5.6, Utilisation de l'adaptateur Zend 1.9 RC 1 Mysqli.

Que dois-je faire?

Répondre

1

Vous ne savez pas si c'est la solution à votre problème, mais qu'en est-il d'essayer avec une version plus récente de PHP?
PHP 5.2.4 est definitly assez vieux - donc, si c'est un bogue dans le pilote mysqli de PHP, il aurait été corrigé depuis ...

En fait, après une recherche rapide, il semble un problème comme celui vous êtes témoin de PHP 5.2.3 et PHP 5.2.4 (et il était encore là en PHP 5.2.5).
Voir bug #42548 : PROCEDURE xxx can't return a result set in the given context (works in 5.2.3!!)

Êtes-vous capable de tester avec quelque chose comme PHP 5.2.9 ou 5.2.10?
Je sais que ce ne sont pas fournis par Ubuntu, même dans la dernière version stable d'Ubuntu :-(Vous pourriez avoir à compiler à partir des sources :-(


Une autre idée serait d'essayer Mith adaptateur pdo_mysql: peut-être il travaillerait avec celui-là?
il pourrait être possible de changer l'adaptateur sans causer trop de problèmes/sans prendre des heures pour tester?


Comme vous travaillez avec Zend Framework 1.9, voici un autre poste qui pourrait intéresser vous, et pourrait être plus facile à tester: stored procedure error after upgrade to 1.8

Une solution facile à essayer serait de revenir à Zend Framework 1.7; Serait-ce 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 ;-)

+0

Très très bons conseils de votre part, merci pour votre précision. – Farid

+0

Ce problème pourrait-il revenir en 5.2.17? Je reçois la même erreur mais la version ultérieure de CentOS PHP. – Clutch

+0

Probablement un autre problème que j'ai trouvé un problème similaire sur la version 5.3.1 en utilisant xammp et windows – Sydwell

5

La réponse est de mettre à jour votre php, je viens de mettre à jour le mien à 5.3. 0, et ça marche comme Candy!

+1

Merci de donner la solution que vous choisissez :-) (Méfiez-vous: l'utilisation de PHP 5.3 pourrait conduire à d'autres problèmes ailleurs dans votre code, car il apporter beaucoup de nouvelles choses ^^) –

1

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 Quoi que nous fassions, ils ne coopéreraient pas donc à la fin ils m'ont donné une Windoze Vista machine et nous avons installé PHP 5.2 .6 et nous sommes partis. Morale de l'histoire: la correspondance des versions compte. Bizarre, je n'ai jamais eu ça auparavant dans aucun autre travail. Mais bon, vous ne pouvez pas tout savoir. Certainement pas un problème MySql, juste PHP.

+0

J'ai été déconcerté pour avoir ce problème sur PHP 5.2.6 en essayant de déployer un système développé sur un serveur de développement PHP 5.3. Donc je vais devoir mettre à niveau. Notez qu'il existe [des problèmes d'incompabilité arrière] (http://www.php.net/manual/fr/migration53.incompatible.php). – Gruber

+0

@Gruber,? Il y a toujours des problèmes d'incompatibilité en arrière. Qu'y a-t-il de si spécial dans ces versions? – Pacerier

1

Il fonctionne également parfaitement avec PHP 5.2.10. Depuis une version antérieure, j'ai utilisé mysqli :: multi_query avec succès pour appeler une procédure problématique et obtenir les bons résultats.

0

Je sais que cette question est ancienne, mais pour ceux qui travaillent encore avec 5.2.4 et obtenir cette erreur, vous pouvez envisager de créer un nouvel objet PDO mysql pour contourner ce problème. J'utilise toujours 5.2.4 sur mon serveur de développement pour assurer la rétrocompatibilité des plugins WordPress que je développe. Vous trouverez ci-dessous une enveloppe autour des appels procéduraux que j'utilise pour appeler avec succès des procédures à la fois dans 5.2.4 (exécuté sur mon serveur dev), qui me donnerait normalement l'erreur, et mon serveur de production (qui exécute une version plus récente ne donne pas l'erreur).

Son WordPress spécifique, mais il ne serait pas difficile de le modifier en utilisant PHP direct.

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


    } 
Questions connexes