【问题标题】:PHP bindParam does not seem to work with a PARAM_INT out parameterPHP bindParam 似乎不适用于 PARAM_INT out 参数
【发布时间】:2012-05-03 09:20:30
【问题描述】:

以下是我的 MySQL 存储过程:

DROP PROCEDURE IF EXISTS sp_authenticate;
CREATE PROCEDURE sp_authenticate(IN user_name VARCHAR(50),
  IN password1 VARCHAR(50), OUT nmatch INT)
BEGIN

  SELECT COUNT(*) INTO nmatch
    FROM user1 u
    WHERE u.name = user_name AND
      u.password1 = password1;

END//

这就是我从 PHP 中调用它的方式:

function authenticate($pdo, $user_name, $password){
  $stmt = $pdo->prepare('CALL sp_authenticate(:user_name, :password, :nmatch)');
  $stmt->bindValue(':user_name', $user_name, PDO::PARAM_STR);
  $stmt->bindValue(':password', $password, PDO::PARAM_STR);
  $nmatch = 888888;
  $stmt->bindParam(':nmatch', $nmatch, PDO::PARAM_INT, 4);
  $result = $stmt->execute();

  return $nmatch;
}

$nmatch 始终保留它的旧值,并且不会从存储过程中接收值。我在这里做错了什么?

MySQL 服务器版本:5.5.22 PHP版本:5.3.10

【问题讨论】:

    标签: php mysql stored-procedures output-parameter


    【解决方案1】:

    this blog中所述:

    不幸的是,PDO 使用的 MySQL C API 存在一个错误,这意味着在调用过程时尝试获取输出参数会导致错误:

    “语法错误或访问冲突:例程 $procedure_name 的 1414 OUT 或 INOUT 参数 $parameter_number 不是变量或新伪变量”。

    您可以在bugs.mysql.com 上查看错误报告。它已针对 5.5.3+ 和 6.0.8+ 版本进行了修复。

    要解决此问题,您需要将 in 和 out 参数分开并调用该过程。 Example #11 on the PHP PDO documentation 会读到:

    $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(:in_string, @out_string)");
    $stmt->bindParam(':in_string', 'hello');
    
    // call the stored procedure
    $stmt->execute();
    
    // fetch the output
    $outputArray = $this->dbh->query("select @out_string")->fetch(PDO::FETCH_ASSOC);
    
    print "procedure returned " . $outputArray['@out_string'] . "\n";
    

    【讨论】:

    • 那也行不通。另外,这是一个 OUT 参数,而不是我使用的 INOUT 参数。
    • @AgnelKurian:完全正确。我在想什么?请参阅我的更新答案。
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多