Frage

Wann immer ich versuche, speichert Prozedur in Mysql zu nennen, die eine Ergebnismenge zurückschickt, hält es mir sagen, dass „nicht ein Ergebnis zurück gesetzt im gegebenen Kontext“.

Ich habe es Google und einige sagten, es ist mysql Fehler, einige sagten, sollten Sie Ihren Mysqli Treiber ändern und ....

Situation:

mysqli Treiber Client-API-Bibliothek Version 5.0.51a verwenden, PHP Version 5.2.4-2ubuntu5.6, die Verwendung von Zend 1.9 RC 1 Mysqli Adapter.

Was soll ich tun!?

War es hilfreich?

Lösung

Nicht sicher ist dies die Lösung für Ihr Problem, aber was mit einer neueren Version von PHP zu versuchen?
PHP 5.2.4 ist auf jeden Fall ziemlich alt - so, wenn es einen Fehler in PHP mysqli-Treiber ist, könnte es da ... korrigiert wurden

Eigentlich nach einer schnellen Suche, scheint es ein Problem, wie die, die Sie erleben, hat sich zwischen PHP 5.2.3 und PHP 5.2.4 (und war immer noch hier in PHP 5.2.5) eingeführt.
Siehe Bug # 42548: xxx VERFAHREN kann kein Ergebnis zurück gesetzt in der gegebenen Kontext (funktioniert in 5.2.3 !!)

Sind Sie in der Lage mit so etwas wie PHP 5.2.9 oder 5.2.10 zu testen?
Ich weiß, diese wird nicht von Ubuntu, auch in der letzten Ubuntu stabilen Version zur Verfügung gestellt :-( Sie haben möglicherweise von den Quellen zu kompilieren: - (


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


Wie Sie mit Zend Framework arbeiten 1,9, hier ist ein weiterer Beitrag, die Sie interessieren könnten, und könnte leichter Test sein: gespeicherten Prozedur Fehler nach dem Upgrade auf 1.8

Eine einfache Lösung, um zu versuchen, dass wieder auf Zend Framework 1.7 zu gehen wäre; wäre es möglich, für Sie, nur um zu testen?


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

Andere Tipps

Die Antwort ist Ihre PHP-Upgrade, ich habe gerade meine zu 5.3.0 aktualisiert haben, und es ist Werke mag Süßigkeit!

Ich hatte dieses Problem vor kurzem auf einem Vertrag. Der Client wurde mit einer Code-Basis auf windoze und PHP 5.2.6 und meine Installation war Linux und PHP 5.3.1 Was wir taten, würden sie nicht kooperieren, um sie am Ende gaben mir einen windoze Vista-Rechner und Installation von PHP 5.2 0,6 und weiter gings. Moral der Geschichte: Version passende zählt. Sonderbare cus ich hatte nie jemals zuvor in einem anderen Job. Aber hey, man kann nicht alles wissen. Sehr definitiv keine MySql Problem, nur PHP.

Es funktioniert perfekt mit PHP 5.2.10 als auch.

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

Ich weiß, diese Frage ist alt, aber für diejenigen, die noch mit 5.2.4 und erhalte diese Störung arbeiten, können Sie ein neues MySQL-PDO Objekt betrachten zu schaffen, um dieses Problem zu arbeiten.

Ich benutze immer noch 5.2.4 auf meinem Dev-Server Abwärtskompatibilität für den Wordpress-Plugins, um sicherzustellen, ich entwickeln.

Im Folgenden finden Sie einen Wrapper um Prozeduraufrufe, die ich erfolgreich Verfahren sowohl 5.2.4 nennen verwenden, um (auf meinem Dev-Server laufen), die mir den Fehler normalerweise geben würde, und meine Produktionsserver (für die eine neuere Version ausgeführt wird, die doesn ‚t gibt den Fehler).

Die Wordpress-spezifisch, aber es wäre es nicht schwierig sein, zu ändern, gerade mit PHP.

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


    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top