У меня простая хранимая процедура в базе данных MySQL:
DELIMITER $$ CREATE DEFINER=`vidhu`@`%` PROCEDURE `test`(var_datain TEXT) BEGIN SELECT var_datain; END
При вызове этой процедуры в mysql-workbench он возвращает данные, которые я ввел:
Теперь, когда я вызываю его из 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];
Вам нужно использовать 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;