PHP PDO не может получить значение параметра OUT - PullRequest
5 голосов
/ 21 июня 2011

Я только начал использовать PHP PDO с хранимыми процедурами MySQL, и у меня возникла проблема с тем, как получить параметры OUT из вызова процедуры.Я просмотрел много похожих тем, связанных со стековым потоком, но, к сожалению, не смог найти способ решить мою проблему: |

Вот подробности:

Процедура принимает 1 входной параметр и имеет 2 обязательныхвыходные параметры и возвращает в них статус результата.

Вот как я его называю:

$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();

Процедура возвращает INT в параметре @o_code и STRING в параметре @o_message.Если он вызывается из CLI, и после вызова я пишу в CLI

select @o_code, @o_message;

, все в порядке, то есть я могу видеть значения, возвращаемые в этих параметрах OUT.Однако я не могу сделать это из кода PHP - по какой-то причине я всегда получаю ЛОЖНЫЕ результаты.Процедура выполняет свою работу правильно, но я просто не могу получить ее результаты.

Я попытался получить следующие значения сразу после выполнения вызова, описанного выше:

$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();

, нони один из них не возвращает никакого результата, отличного от NULL или FALSE.Я также пробовал с bindParam, но все равно не смог заставить его работать.

Спасибо за любую помощь по этому вопросу и хорошего дня!

----- РЕДАКТИРОВАТЬ -----

Вот код, который я пробовал с bindParam, который все еще не работает:

$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

1 Ответ

6 голосов
/ 23 июня 2011

Проблема заключалась в том, что первый запрос, который вызывает хранимую процедуру, не считается завершенным и закрытым, и PDO не выполнит другой запрос, пока не будет выполнен предыдущий запрос.

Решение было добавить $proc->closeCursor();

Весь рабочий образец:

$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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...