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
Znaleziona: http://stackoverflow.com/a/32224294/2717254 –
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
Odpowiedź dotyczy uzyskania wartości parametru wyjściowego! Wywołanie closeCursor() nie jest zaangażowane. Zaktualizowałem odpowiedź, by lepiej wyjaśnić –