在php中使用pdo和存储过程

时间:2012-08-07 00:40:45

标签: php mysql stored-procedures pdo

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

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

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

Screenshot form mysql work bench

现在,当我使用 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];

3 个答案:

答案 0 :(得分:19)

您需要使用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

答案 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;