我在MySQL数据库中有一个简单的存储过程:
DELIMITER $$
CREATE DEFINER=`vidhu`@`%` PROCEDURE `test`(var_datain TEXT)
BEGIN
SELECT var_datain;
END
在mysql-workbench中调用此过程时,它返回我输入的数据:
现在,当我使用 pdo 从PHP调用它时出现错误:
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];
答案 0 :(得分:19)
使用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
答案 1 :(得分:-1)
bindParam
函数只接受值变量,这就是为什么参数 2 hai
不是变量 cannot be passed
。
所以不需要bindValue,而是正确使用bindParam。
示例:使用 bindParam 时:
来自你的片段。
$a = "hai";
$db = new PDO(DSN, DBUSER, DBPASS);
$stmt = $db->prepare("CALL test(?)");
$stmt->bindParam(s, $a, PDO::PARAM_STR);
$rs = $stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo $result[0];
这应该可以解决您的问题,而不是上面的答案。
答案 2 :(得分:-2)
以下代码适用于没有prepare语句的调用!
$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;