2009-07-29 4 views
8

Wann auch immer ich versuche, eine Prozedur in mysql aufzurufen, die eine Ergebnismenge zurücksendet, sagt sie mir immer wieder, dass "eine Ergebnismenge im gegebenen Kontext nicht zurückgegeben werden kann".Kann eine Ergebnismenge im angegebenen Kontext nicht zurückgeben

Ich habe es Google und einige sagten, es mysql Fehler ist, sagte, einige Sie Ihre Mysqli Fahrer und ....

Situation ändern sollte:

Mit Mysqli Treiber Client-API-Bibliothek Version 5.0.51a, PHP Version 5.2.4-2ubuntu5.6, Verwenden von Zend 1.9 RC 1 Mysqli Adapter.

Was soll ich tun !?

Antwort

1

Nicht sicher, das ist die Lösung für Ihr Problem, aber was ist mit versuchen, mit einer neueren Version von PHP?
PHP 5.2.4 definitly ziemlich alt ist - so, wenn es ein Fehler in PHP mysqli-Treiber ist, könnte es da ...

Eigentlich nach einer schnellen Suche, wurde korrigiert, so scheint es ein Problem wie die Sie werden Zeuge wurde zwischen PHP 5.2.3 und PHP 5.2.4 eingeführt (und war immer noch hier in PHP 5.2.5). bug #42548 : PROCEDURE xxx can't return a result set in the given context (works in 5.2.3!!)

Können Sie mit etwas wie PHP 5.2.9 oder 5.2.10 testen?
Ich weiß, diese werden nicht von Ubuntu zur Verfügung gestellt, auch in der letzten Ubuntu stabile Version :-(Sie müssen aus Quellen :-(


Noch eine andere Idee kompilieren könnte, wäre mith pdo_mysql Adapter, um zu versuchen: vielleicht es würde mit, dass man arbeiten?
es möglich sein könnte, ohne Adapter zu ändern, zu viel Ärger/ohne Stunden zu nehmen?


zu testen, wie Sie mit Zend Framework 1.9 arbeiten, ist hier eine andere Stelle, die Sie interessieren könnten Sie und vielleicht einfacher zu testen: stored procedure error after upgrade to 1.8

Eine einfache Lösung zu versuchen, wäre, zu Zend Framework 1.7 zurückzukehren; Wäre es möglich für dich, nur zu testen?


Wie auch immer ... Viel Glück!
Und vergessen, wenn Sie die Lösung finden, nicht, was das Problem war, um anzuzeigen, und wie Sie es ;-) gelöst

+0

Sehr Sehr gute Ratschläge von Ihnen, danke für Ihre Richtigkeit. – Farid

+0

Könnte dieses Problem in 5.2.17 zurückkommen? Ich bekomme den gleichen Fehler, aber CentOS PHP spätere Version. – Clutch

+0

Wahrscheinlich ein anderes Problem, da ich ein ähnliches Problem in Version 5.3.1 mit XAMMP und Windows – Sydwell

5

Die Antwort Ihre PHP-Upgrade ist, habe ich meine auf 5,3 nur aufgewertet. 0, und es funktioniert wie Candy!

+1

fand Danke für die Lösung, die Sie wählen :-) (Seien Sie vorsichtig: PHP 5.3 kann zu anderen Problemen in Ihrem Code führen, wie es bringen Sie viele neue Sachen ^^) –

1

Ich hatte dieses Problem vor kurzem auf einem Vertrag. Der Client benutzte eine Codebase auf windoze und php 5.2.6 und meine Installation war linux und php 5.3.1 Was auch immer wir taten, sie würden nicht zusammenarbeiten, also gaben sie mir am Ende eine windoze vista Maschine und wir installierten php 5.2 .6 und los ging es. Moral der Geschichte: Versionsvergleich zählt. Sonderbare Kunden, die ich noch nie in einem anderen Job hatte. Aber hey, du kannst nicht alles wissen. Ganz bestimmt kein MySql-Problem, nur PHP.

+0

Ich war flummoxed, um dieses Problem auf PHP 5.2.6 zu bekommen, wenn Sie versuchen, ein System zu implementieren, das auf einem PHP 5.3 Entwicklungsserver entwickelt wurde. Also muss ich upgraden. Beachten Sie, dass es [Probleme mit der Rückwärtsinkompatibilität] gibt (http://www.php.net/manual/en/migration53.incompatible.php). – Gruber

+0

@Gruber,? Es gibt immer wieder inkompatible Probleme. Was ist das Besondere an diesen Versionen? – Pacerier

1

Es funktioniert auch perfekt mit PHP 5.2.10.

Von einer früheren Version habe ich erfolgreich mysqli :: multi_query verwendet, um eine problematische Prozedur aufzurufen und die richtigen Ergebnisse zu erhalten.

0

Ich weiß, diese Frage ist alt, aber für diejenigen, die immer noch mit 5.2.4 arbeiten und diesen Fehler bekommen, können Sie ein neues mysql PDO-Objekt erstellen, um dieses Problem zu umgehen.

Ich benutze immer noch 5.2.4 auf meinem Dev-Server, um Abwärtskompatibilität für die WordPress-Plugins zu gewährleisten, die ich entwickle.

Unten ist ein Wrapper um prozedurale Aufrufe, die ich zum erfolgreichen Aufruf von Prozeduren in 5.2.4 (auf meinem Dev-Server ausgeführt), die normalerweise den Fehler geben würde, und mein Produktionsserver (der eine neuere Version ausführt) verwenden gibt den Fehler nicht).

Seine WordPress-spezifische, aber es wäre nicht schwer, es mit geraden PHP zu ändern.

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


    } 
Verwandte Themen