Intereting Posts
Разбор RSS-канала в PHP с помощью DOM Ошибка 245 в mysql Значение коэффициента обменного курса PHP grab json из ответа API получение типа изображения удаленного изображения в php SQL-дизайн и / или класс PHP для хранения динамических двумерных массивов? Использование MySQL, как мне выбрать ранг результата запроса для одной конкретной строки? Как избежать устаревшей ошибки времени вызова в PHP? Хадсон продолжает терпеть неудачу с Phing And Ant. Любые намеки? Как отключить таймер обратного отсчета при обновлении браузера? Как экспортировать строку Base64 в файл на стороне сервера, не сохраняя его на веб-сервере, напрямую с помощью PHP? Изменение параметра конфигурации php.ini в phpunit.xml Функциональность php DateTime createFromFormat Использование nonce в качестве решения безопасности в PHP Typeahead remote с Laravel 4 – Я работаю над отдельными работами, но не работаю вместе Сохранение арабского текста в базе данных mysql с использованием php

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

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

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

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

 SELECT @outputparam; 

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

Совет. Если вы используете устаревший DBLib для подключения к SQL Server и вы изменили хранимую процедуру, как было предложено, вам также потребуется настроить ваш синтаксис, чтобы получить значение выходного параметра в вызывающем скрипте 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 

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