Вызов хранимой процедуры с параметром Out с помощью PDO

Я использую PDO уже некоторое время и рефакторинг проекта, так что он использует сохраненные procs вместо встроенного SQL. Я получаю ошибку, которую не могу объяснить.Я использую PHP версии 5.3.5 и MySQL версии 5.0.7.

Я просто пытаюсь получить базовый сохраненный proc с выходом для работы. Вот сохраненный 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, однако я не могу найти, в чем проблема. Я следую инструкциям в руководство но я все еще получаю эту ошибку. Может ли кто-нибудь предположить, что я делаю неправильно? Любой совет был бы очень признателен. Спасибо!

3 ответов


казалось бы, что здесь есть ошибка, лучшее решение, которое я нашел, это:

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

см. также это:https://stackoverflow.com/a/4502524/815386


вам нужно указать, что ваш параметр имеет стиль 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";

понял! Просто добавьте

SELECT @outputparam;

в конце хранимой процедуры, где @outputparam-это имя, используемое для параметра в определении хранимой процедуры. Если вы не можете изменить хранимую процедуру, вы должны сделать второй запрос, для SELECT @outputparam, с PHP PDO, чтобы получить выходное значение param.

Совет: Если вы используете устаревший DBLib для подключения к SQL Server и изменили хранимую процедуру, как было предложено, вам также нужно настроить синтаксис, чтобы получить выходное значение param в вызывающем скрипте PHP:

$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