2010-02-22 16 views
7

Używam kwerendy z mysql procedury przechowywanej:Procedura składowana powoduje „Polecenia z synchronizacją” na następnej zapytania

$AddProf_qr = mysql_query("call AddStudent('$d_Pass', '$d_Titl', '$d_Firs', '$d_Midd', '$d_Last', '$d_Addr', '$d_City', '$d_Stat', '$d_County', '$d_Zipc', $d_Gend, '$d_Birh', '$d_Phom', '$d_Phoh', '$d_Phoo', '$d_Email', '$d_Webs', '$d_Natn', '$d_Profsn', '$d_Compny', '$d_Desig', $d_ProfAcc)", $this->c_remote) or die ("first call" . mysql_error($this->c_remote)); 

jestem podobno dostać tylko jeden wynik z rozmowy: @@ IDENTITY = numer;

$AP_result = mysql_fetch_array($AddProf_qr); 
$CurrentSID = $AP_result['@@IDENTITY']; 

który działa dobrze. ale gdy uruchomię następne zapytanie aktualizacji mysql zaraz po tym, pojawia się komunikat o błędzie:

Błąd: 2014 (CR_COMMANDS_OUT_OF_SYNC) Wiadomość: Polecenia niezsynchronizowane; nie można uruchomić tego polecenia teraz

Próbowałem wkładając:

mysql_free_result($AddProf_qr); 

ale nadal to samo.

Wywołanie MySQL wykonuje również dobrze reszta skryptu działa bez problemów, o których wyżej wspomniano. ale nie działają w tym samym czasie. Domyślam się, że połączenie robi coś, co to psuje.

+0

jest przejście do mysqli lub PDO opcję? – VolkerK

+0

Mam cały skrypt napisany w mysql (kilka zapytań). Miałem nadzieję, że ktoś wie, o co w tym wszystkim chodzi, zanim go ponownie napiszę. – DMin

+3

mysql() to kupa bzdura i przestarzałe – hobodave

Odpowiedz

8

Twoja procedura składowana zwraca wiele zestawów wyników. Patrz: this post

Rozwiązanie?

  • Zastosowanie mysqli_multi_query
  • zaprzestać używania starożytną bibliotekę mysql - I w mysqli oznacza "Lepsza" - nie bez powodu.
+0

mysqli nie rozwiązuje tego problemu, ale odpowiedź była bardzo pomocna jednak :-) – Richard

0

Sprawdź tutaj: http://us3.php.net/manual/en/function.mysql-query.php W komentarzach, jeden facet twierdzi, że zrobił to działa przez ustawienie flagi połączenia do MYSQL_MULTI_RESULTS (131072).

Ale byłoby znacznie lepiej użyć mysqli ...

+0

ok, rozwiązany. nie najlepsze rozwiązanie na świecie, ale tak długo, jak to działa, jestem szczęśliwy. To było pierwsze zapytanie w moim skrypcie. Zrobiłem połączenie z bazą danych, uruchomiłem zapytanie. zamknęło połączenie. nawiązał nowe połączenie i uruchomił resztę skryptu. :) – DMin

2

@DMin Tak to będzie działać, ale będziesz awarię serwera prędzej czy później. Po prostu zrób matematykę, jedną odpowiedź na stronę, która tworzy 3 * liczbę procedur do bazy danych! Pomyśl o tym!

[UPDATE] Rozwiązanie:

$aCategory = array(); 
$it=0; 
$res = $mysqli->multi_query("call ListCategory();"); 
if($res) { 
    do { 
    if ($result = $mysqli->store_result()) { 

     while($row = $result->fetch_row()) { 
       $aCategory[$it] =$row; 
       $it= $it + 1; 
     } 
     $result->close(); 
    } 
    } while($mysqli->next_result()); 
} 

foreach($aCategory as $row){ 
    echo . $row[0] . " - " . $row[1] . "<br />"; 
} 

Chciałem tylko dodać, że jesteś gotowy, aby zadzwonić do następnej procedury.

PS: W ten sposób nie mogłem użyć

echo $aCategory['category_id'] ; 
//or 
echo $aCategory->category_id; 
//just 
echo $aCategory[0] 
0

mysql_free_result (client-> Res);

while (mysql_more_results(client->conn)) 
{ 
    mysql_next_result(client->conn); 
} 

ten sam urok dla mnie :)

0

tabel wynikowych zwracanych przez procedury składowanej nie mogą być pobrane poprawnie używając mysqli_query(). Funkcja mysqli_query() łączy wykonanie instrukcji i pobranie pierwszego zestawu wyników do zbuforowanego zestawu wyników, jeśli taki istnieje. Istnieją jednak dodatkowe zestawy wyników procedury składowanej ukryte przed użytkownikiem, które powodują, że mysqli_query() nie może zwrócić oczekiwanych przez użytkownika zestawów wyników.

Zestawy wyników zwrócone przez procedurę przechowywaną są pobierane za pomocą mysqli_real_query() lub mysqli_multi_query(). Obie funkcje umożliwiają pobieranie dowolnej liczby zestawów wyników zwracanych przez instrukcję, takich jak CALL.

spojrzenie na official manual

Powiązane problemy