Использование pdo в php с хранимой процедурой

У меня простая хранимая процедура в базе данных MySQL:

DELIMITER $$ CREATE DEFINER=`vidhu`@`%` PROCEDURE `test`(var_datain TEXT) BEGIN SELECT var_datain; END 

При вызове этой процедуры в mysql-workbench он возвращает данные, которые я ввел:

Скриншот для работы с mysql

Теперь, когда я вызываю его из PHP с помощью pdo, я получаю сообщение об ошибке:

 Fatal error: Cannot pass parameter 2 by reference in C:/apache......(3rd line) 

Вот мой php-код:

 $db = new PDO(DSN, DBUSER, DBPASS); $stmt = $db->prepare("CALL test(?)"); $stmt->bindParam(1, 'hai!', PDO::PARAM_STR); $rs = $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); echo $result[0]; 

Solutions Collecting From Web of "Использование pdo в php с хранимой процедурой"

Вам нужно использовать bindValue вместо bindParam .

Когда вы используете bindParam, он связывает переменную, предоставленную параметру, а не значение переменной.

Итак, если вы это сделаете:

 $x = 5; $stmt->bindParam(1, $x, PDO::PARAM_INT); $x = 6; $stmt->execute(); //executes with 6 instead of 5 

Фактически это выполняется с 6, а не с 5. Для этого метод должен иметь ссылку на переменную. Вы не можете иметь ссылку на литерал, поэтому это означает, что bindParam нельзя использовать с литералами (или с чем-либо, с чем у вас нет ссылки).

 $x = 5; $stmt->bindValue(1, $x, PDO::PARAM_INT); $x = 6; $stmt->execute(); //executes with 5 instead of 6 

Затем:

 $stmt->bindParam(1, 1, PDO::PARAM_INT); //invalid because there's no way to pass a literal 1 by reference $stmt->bindValue(1, 1, PDO::PARAM_INT); //valid 

Следующий код работает для вызова без инструкции!

 $query="CALL store_procedure_name(@a)"; $conn->query($query); $query="SELECT @a as outvar;"; $result = $conn->query($query); foreach ($result as $x) { $res=$x['outvar']; } echo $res;