2011-06-21 8 views
5

Właśnie zacząłem używać PHP PDO z przechowywanymi procedurami MySQL i mam problem z uzyskaniem parametrów OUT z wywołania procedury. Spojrzałem na wiele podobnych tematów stackoverflow, ale niestety nie mogłem znaleźć sposobu na rozwiązanie mojego problemu: |PHP PDO nie może uzyskać wartości parametru OUT

Oto szczegóły:

Zabieg trwa 1 parametr wejściowy i ma 2 obowiązkowych parametrów wyjściowych i powraca spowodować stan w nich.

To jak ja to nazywam:

$input = 5; 
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass"); 
$proc = $mydb->prepare("CALL proc_name($input, @o_code, @o_message)"); 
$proc->execute(); 

Procedura zwraca INT w parametrze @o_code i łańcuch w parametrze @o_message. Jeśli to się nazywa z CLI, a po wywołaniu piszę w CLI

select @o_code, @o_message; 

wszystko jest OK, to jestem w stanie wyświetlić wartości zwróconych w tych OUT parametrów. Jednak nie mogę tego zrobić z kodu PHP - z jakiegoś powodu zawsze otrzymuję FALSE wyniki. Procedura działa prawidłowo, ale nie mogę uzyskać jej wyników.

Próbowałem następujące metody w celu uzyskania wartości, tuż po dokonaniu połączenia opisane powyżej:

$output = $proc->fetch(PDO::FETCH_ASSOC); // also with PDO:FETCH_OBJ 
$output = $mydb->query("select @o_code, @o_message"); 
$output = $mydb->query("select @o_code, @o_message")->fetch(); 
$output = $mydb->query("select @o_code, @o_message")->fetchColumn(); 
$output = $mydb->query("select @o_code, @o_message")->fetchAll(); 

ale żaden z nich nie zwraca żadnych wynik różny od NULL lub FAŁSZ. Próbowałem także z bindParam, ale nadal nie mogłem go uruchomić.

Dziękujemy za pomoc w tej kwestii i dobry dzień!

----- EDIT -----

Oto kod, który Próbowałem z bindParam, która nadal nie działa:

$input = 5; 
$proc = $mydb->prepare("CALL proc_name(?, ?, ?)"); 
$proc->bindParam(1, $input, PDO::PARAM_INT); 
$proc->bindParam(2, $code, PDO::PARAM_INT); 
$proc->bindParam(3, $message, PDO::PARAM_STR); 
$proc->execute(); 

var_dump($code, $message); // NULL, NULL 
+0

Znaleziona: http://stackoverflow.com/a/32224294/2717254 –

+0

Pytanie wskazując, że jesteś ma inny problem i nie rozwiązuje problemu z zamieszczonym tutaj pytaniem. Możesz sprawdzić akceptowaną odpowiedź poniżej, aby zobaczyć, że problem polegał na "closeCursor()", aby rzeczy działały poprawnie. Twoja odpowiedź w drugim pytaniu ma tę linię kodu, więc domyślam się, że to też nie zadziała. – middlehut

+1

Odpowiedź dotyczy uzyskania wartości parametru wyjściowego! Wywołanie closeCursor() nie jest zaangażowane. Zaktualizowałem odpowiedź, by lepiej wyjaśnić –

Odpowiedz

5

Problem polegał na tym, że pierwsze zapytanie, które wywołanie procedury składowanej nie jest uważane za zakończone i zamknięte, a PDO nie wykona kolejnego zapytania, dopóki nie zostanie wykonane poprzednie zapytanie.

Rozwiązaniem było dodać $proc->closeCursor();

Cała próbka robocza wynosi:

$input = 5; 
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass"); 
$proc = $mydb->prepare("CALL proc_name($input, @o_code, @o_message)"); 
$proc->execute(); 
$proc->closeCursor(); 

$output = $mydb->query("select @o_code, @o_message")->fetch(PDO::FETCH_ASSOC); 
var_dump($output); // array('@o_code'=>value, 'o_message'=>value)