2009-07-29 23 views
8

Kiedykolwiek próbuję wywołać procedurę składowania w mysql, która odsyła zestaw wyników, ciągle mówi mi, że "nie może zwrócić zestawu wyników w danym kontekście".Nie można zwrócić zestawu wyników w danym kontekście

Mam google to i powiedział, że to jakiś błąd mysql, niektórzy mówili, należy zmienić sterownik mysqli i ....

Sytuacja:

Korzystanie mysqli Client kierowca wersja biblioteki API 5.0.51a, Wersja PHP 5.2.4-2ubuntu5.6, Używanie adaptera Mysqli Zend 1.9 RC 1.

Co powinienem zrobić !?

Odpowiedz

1

Nie jestem pewien, czy to jest rozwiązanie twojego problemu, ale co z próbowaniem z nowszą wersją PHP?
PHP 5.2.4 jest zdecydowanie dość stary - tak, jeśli jest to błąd w sterowniku mysqli PHP, to może zostały poprawione od ...

Faktycznie, po szybkim wyszukiwaniu, wydaje się problem, jak ten jesteś świadkiem został wprowadzony między PHP 5.2.3 i PHP 5.2.4 (i nadal tu w PHP 5.2.5).
Zobacz bug #42548 : PROCEDURE xxx can't return a result set in the given context (works in 5.2.3!!)

Czy jesteś w stanie przetestować coś podobnego do PHP 5.2.9 lub 5.2.10?
znam te nie są świadczone przez Ubuntu, nawet w ostatniej stabilnej wersji Ubuntu :-(może trzeba kompilować ze źródeł :-(


Jeszcze innym pomysłem byłoby spróbować mith adapter pdo_mysql: może będzie pracować z tym jednym?
to może być możliwe, aby zmienić zasilacz, nie powodując zbyt wiele problemów/bez wielogodzinnego testu?


Gdy pracujemy z Zend Framework 1.9, oto kolejny post, który może zainteresować Ty i możesz łatwiej je przetestować: stored procedure error after upgrade to 1.8

Łatwym rozwiązaniem jest powrót do Zend Framework 1.7; czy to możliwe, żeby przetestować?


W każdym razie ... Powodzenia!
A jeśli znajdziesz rozwiązanie, nie zapomnij wskazać, na czym polegał problem, i jak go rozwiązałeś ;-)

+0

Bardzo, bardzo dobre porady od was, dzięki za waszą dokładność. – Farid

+0

Czy ten problem mógł powrócić w wersji 5.2.17? Otrzymuję ten sam błąd, ale późniejszą wersję CentOS PHP. – Clutch

+0

Prawdopodobnie inny problem, ponieważ znalazłem podobny problem w wersji 5.3.1 z użyciem xammp i Windows – Sydwell

5

Odpowiedź brzmi: zaktualizuj swój php, właśnie zaktualizowałem kopalnię do wersji 5.3. 0, a to działa lubi Candy!

+1

Dziękuję za podanie wybranego rozwiązania :-) (Uwaga: używanie PHP 5.3 może prowadzić do innych problemów w innym miejscu kodu, ponieważ przywieźć mnóstwo nowych rzeczy ^^) –

1

Niedawno miałem ten problem z umową. Klient korzystał z kodu źródłowego na windoze i php 5.2.6, a moja instalacja była linuxem i php 5.3.1 Cokolwiek zrobiliśmy, nie współpracowaliby, więc w końcu dali mi windoze vista i zainstalowaliśmy php 5.2 .6 i dalej poszliśmy. Morał z historii: liczy się dopasowanie do wersji. Dziwne, nigdy wcześniej nie miałem tego w żadnej innej pracy. Ale hej, nie możesz wszystkiego wiedzieć. Zdecydowanie nie jest to kwestia MySql, tylko PHP.

+0

Byłem oszołomiony, aby uzyskać ten problem w PHP 5.2.6, próbując wdrożyć system opracowany na serwerze programistycznym PHP 5.3. Więc będę musiał ulepszyć. Zauważ, że istnieją [problemy z nieścisłościami wstecz] (http://www.php.net/manual/en/migration53.incompatible.php). – Gruber

+0

@Gruber,? Zawsze są problemy z niekompatybilnością wsteczną. Co jest takiego specjalnego w tych wersjach? – Pacerier

1

Działa również doskonale z PHP 5.2.10.

Korzystając z wcześniejszej wersji, z powodzeniem używam mysqli :: multi_query do wywołania problematycznej procedury i uzyskania właściwych wyników.

0

Wiem, że to pytanie jest starożytne, ale dla osób, które nadal pracują z 5.2.4 i otrzymujących ten błąd, możesz rozważyć utworzenie nowego obiektu mysql PDO, aby obejść ten problem.

Nadal używam 5.2.4 na moim serwerze, aby zapewnić zgodność wsteczną wtyczek WordPress, które rozwijam.

Poniżej znajduje się otoki proceduralne, których używam do skutecznego wywoływania procedur w wersji 5.2.4 (uruchamianej na moim serwerze dev), co zwykle daje mi błąd, i mojego serwera produkcyjnego (który uruchamia nowszą wersję nie podaje błędu).

Jego specyfikacja WordPress, ale nietrudno go zmodyfikować za pomocą prostego 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); 


    } 
Powiązane problemy