Вызов хранимой процедуры с параметром Out с использованием PDO
Я уже давно использую PDO и рефакторинг проекта, чтобы он использовал хранимые procs вместо встроенного SQL. Я получаю сообщение об ошибке, которое не могу объяснить. Я использую PHP версии 5.3.5 и MySQL версии 5.0.7.
Я просто пытаюсь получить базовый хранимый процесс с выходом для работы. Здесь хранится proc:
DELIMITER //
CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100))
BEGIN
SET var1 = 'This is a test';
END //
Вот код, который я использую для вызова proc, $db - это экземпляр PDO:
$stmt = $db->prepare("CALL proc_OUT(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);
// call the stored procedure
$stmt->execute();
echo $returnvalue;
Простенько? Однако это приводит к следующей ошибке:
exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1414 OUT or INOUT argument 1 for routine mydb.proc_OUT is not a variable or NEW pseudo-variable in BEFORE trigger
Если я вызову proc прямо так:
CALL proc_OUT(@res);
SELECT @res;
он работает так, как ожидалось, что заставляет меня думать, что есть проблема с тем, как его вызывают с PHP, однако я не могу найти, что проблема. Я следую инструкциям в руководстве, но я все еще получаю эту ошибку. Может ли кто-нибудь предположить, что я могу делать неправильно? Любые советы были бы очень оценены. Большое спасибо!
Ответы
Ответ 1
Казалось бы, здесь есть ошибка, лучшее решение, которое я нашел, это:
http://www.php.net/manual/en/pdo.prepared-statements.php#101993
Из комментария по ссылке выше:
$dbh->query("CALL SomeStoredProcedure($someInParameter1, $someInParameter2, @someOutParameter)");
$dbh->query("SELECT @someOutParameter");
// OR, if you want very much to use PDO.Prepare(),
// insert "SELECT @someOutParameter" in your stored procedure and then use:
$stmt = $dbh->prepare("CALL SomeStoredProcedure(?, ?)");
$stmt ->execute(array($someInParameter1, $someInParameter2));
Смотрите также это: fooobar.com/questions/262662/...
Ответ 2
Вам нужно указать, что ваш параметр - это стиль IN/OUT, например, пример веб-сайта PHP:
http://php.net/manual/en/pdo.prepared-statements.php пример # 5
<?php
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
// call the stored procedure
$stmt->execute();
print "procedure returned $value\n";
Ответ 3
Получил! Просто добавьте
SELECT @outputparam;
в конце хранимой процедуры, где @outputparam - это имя, используемое для параметра в определении хранимой процедуры. Если вы не можете редактировать хранимую процедуру, вы должны сделать второй запрос для SELECT @outputparam с PHP PDO, чтобы получить значение выходного параметра.
Совет. Если вы используете устаревший DBLib для подключения к SQL Server и вы изменили хранимую процедуру, как было предложено, вам также потребуется настроить ваш синтаксис, чтобы получить значение выходного параметра в вызывающем PHP script:
$out = 0;
$sth = $db->prepare("DECLARE @myout INT; EXECUTE mysp :firstparam, :secondparam, @myout OUTPUT;"); // the DECLARE trick is needed with DBLib
$sth->bindParam(':firstparam', $firstparam, PDO::PARAM_INT);
$sth->execute();
$sth->bindColumn(1, $out, PDO::PARAM_INT);
$sth->fetch(PDO::FETCH_BOUND);
var_dump($out); // works