在php中使用pdo和存储过程

Kri*_*son 7 php mysql pdo stored-procedures

我在MySQL数据库中有一个简单的存储过程:

DELIMITER $$
CREATE DEFINER=`vidhu`@`%` PROCEDURE `test`(var_datain TEXT)
BEGIN
    SELECT var_datain;
END
Run Code Online (Sandbox Code Playgroud)

在mysql-workbench中调用此过程时,它返回我输入的数据:

截图形式mysql工作台

现在,当我使用pdo从PHP调用它时,我收到一个错误:

Fatal error: Cannot pass parameter 2 by reference in C:/apache......(3rd line)
Run Code Online (Sandbox Code Playgroud)

这是我的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];
Run Code Online (Sandbox Code Playgroud)

Cor*_*bin 20

您需要使用bindValue而不是bindParam.

使用bindParam时,它会绑定提供给参数的变量,而不是变量的值.

所以,如果你这样做:

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

它实际上是用6而不是5来执行.为此,该方法必须具有对变量的引用.您不能引用文字,因此这意味着bindParam不能与文字(或任何您无法引用的文件)一起使用.

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

然后:

$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
Run Code Online (Sandbox Code Playgroud)