【问题标题】:PHP PDO / Retrieving OUT Parameters from MySQL Stored ProcedurePHP PDO / 从 MySQL 存储过程中检索 OUT 参数
【发布时间】:2013-03-22 08:48:20
【问题描述】:

我需要从 MySQL 存储过程中检索 OUT 参数。我找不到任何可以解释这一点的东西(并且对我来说很有意义)。

try {
$dsn = 'mysql:dbname=db_name;host=localhost';
$dbh = new PDO($dsn, 'usr_name', 'password');
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}

$stmt = $dbh->prepare("CALL db.stprNewUser(:usrEmail,:newUserOK,:stprComment)");

$stmt->bindParam(':usrEmail', $tmpEmail, PDO::PARAM_STR); 
$stmt->bindParam(':newUserOK', $newUserOK, PDO::PARAM_INT,1); 
$stmt->bindParam(':stprComment', $stprComment, PDO::PARAM_STR,100); 

$stmt->execute();

$outputArray = $dbh->query("select @newUserOK, @stprComment")->fetch(PDO::FETCH_ASSOC);

print "procedure returned [" . $outputArray['@newUserOK'] . $outputArray['@stprComment'] . "]\n";

我在另一个 SO 项上找到了最后两行,但它只返回 NULL 值。

【问题讨论】:

    标签: php mysql stored-procedures pdo


    【解决方案1】:

    试试这个... 看看有没有用...

    try 
    {
        $dsn = 'mysql:dbname=db_name;host=localhost';
        $dbh = new PDO($dsn, 'usr_name', 'password');
    } 
    catch (PDOException $e) 
    {
        echo 'Connection failed: ' . $e->getMessage();
    }
    
    
    //$stmt = $dbh->prepare("CALL db.stprNewUser(:usrEmail,:newUserOK,:stprComment)");
    //changed :newUserOK to @newUserOK
    //changed :stprComment to @stprComment
    $stmt = $dbh->prepare("CALL db.stprNewUser(:usrEmail,@newUserOK,@stprComment);");
    
    //declare only input parameters.
    //good pratice put string length. assuming varchar(100).
    $stmt->bindParam(':usrEmail', $tmpEmail, PDO::PARAM_STR,100); 
    
    //dont need these
    // $stmt->bindParam(':newUserOK', $newUserOK, PDO::PARAM_INT,1); 
    // $stmt->bindParam(':stprComment', $stprComment, PDO::PARAM_STR,100); 
    
    $stmt->execute();
    
    $outputArray = $dbh->query("select @newUserOK, @stprComment;")->fetchAll();
    
    foreach($outputArray as $row)
    {
       "NewUserOk:" .  $row["@newUserOk"] . ", StprComment:" . $row["@stprComment"];
    }
    
    //$outputArray = $dbh->query("select @newUserOK, @stprComment")->fetch(PDO::FETCH_ASSOC);
    //print "procedure returned [" . $outputArray['@newUserOK'] . $outputArray['@stprComment'] . "]\n";
    

    【讨论】:

      【解决方案2】:

      除了使用 MySQL 会话变量,你可以只使用bindParam()

      bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )

      将 PHP 变量绑定到相应的命名或问号 SQL 语句中的占位符,用于准备 陈述。与 PDOStatement::bindValue() 不同,变量绑定为 一个参考,并且只会在那个时候被评估 PDOStatement::execute() 被调用。

      大多数参数是输入参数,即参数 以只读方式用于构建查询。一些司机 支持调用将数据作为输出返回的存储过程 参数,还有一些也作为输入/输出参数发送 数据并更新以接收它。

      别忘了使用相应的占位符:

      $stmt = $dbh->prepare("CALL superior_main_db.stprNewUser(:usrEmail, :newUserOK, :stprComment)");
      

      执行语句后,您的变量将自动包含您需要的值。

      【讨论】:

      • OP是在问如何使用存储过程,而不是如何绑定参数不是吗?
      • @vascowhite - 请再次阅读问题。他在问如何检索 OUT 参数。
      • 哦,是的,你是对的。他已经说过他不懂手册,所以如果没有示例,这将无济于事。
      • @vascowhite - 我做了一点修改,现在让我们看看它是否更清晰。
      • 仍然没有得到输出参数的结果。 :-s
      【解决方案3】:

      要检索@newUserOK 和@stprComment 变量,只需在调用存储过程后执行以下查询,如下所示

      SELECT @newUserOK, @stprComment
      

      【讨论】:

      • 阿米特,如何在当前代码的上下文中执行上述查询?
      • 同你执行其他查询 $stmt = $dbh->prepare ("SELECT @newUserOK, @stprComment");
      猜你喜欢
      • 2014-07-08
      • 1970-01-01
      • 2019-06-27
      • 2012-07-26
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多