【问题标题】:Using pdo in php with stored procedure在 php 中使用 pdo 和存储过程
【发布时间】:2012-08-03 23:43:58
【问题描述】:

我在 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];

【问题讨论】:

  • 哪一行?我没有看到任何通过引用传递的内容
  • $stmt->bindParam(1, 'hai!', PDO::PARAM_STR); 的行

标签: php mysql stored-procedures pdo


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    bindParam 函数只接受值变量,这就是为什么参数二 hai 不是变量 cannot be passed。 所以不需要bindValue,而是正确使用bindParam。 示例:使用 bindParam 时: 来自你的 sn-p。

    $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];
    

    这应该解决你的问题,而不是上面的答案。

    【讨论】:

      【解决方案3】:

      以下代码适用于不带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;
      

      【讨论】:

        猜你喜欢
        • 2013-08-26
        • 2017-08-09
        • 2013-08-22
        • 2012-03-07
        • 2012-09-12
        • 2014-08-08
        • 2019-05-11
        • 2014-09-07
        • 2013-09-10
        相关资源
        最近更新 更多