使用输入和输出参数从php函数调用MySQL存储过程

时间:2017-05-06 16:34:52

标签: php mysql stored-procedures pdo

现在我已经从wchiquito获得了一个很棒的存储过程解决方案,我实际上很难用它来提取任何数据。

我正在使用带有pdo的mysql db,传递3个参数(2个输入和1个输出)。我按照PHP手册中的示例尝试了bindValue和bindParam。然而,这两种方法都会导致错误,我无法看到它在哪里横向发展。

使用bindValue,以下代码返回错误: “致命错误:未捕获异常'PDOException',消息'SQLSTATE [HY093]:参数号无效:参数未在第41行的confirmation.php中定义”。第41行是执行。

$stmt = $pdo->prepare("CALL sp_GetUserID(?,?,?)");
$v1 = "tbl_JustSayThanks";
$v2 = "16e90ccf482e72b9a562f5613b659fed";
$v3 = "";
$stmt->bindValue(':tablename_In',$v1, PDO::PARAM_STR);
$stmt->bindValue(':formSecret_In',$v2, PDO::PARAM_STR);
$stmt->bindValue(':id_Out',$v3, PDO::PARAM_INT);
$stmt->execute();
$data = $stmt->fetchAll();
foreach ($data as $row) {
    return $row['id_Out'];
}

使用bindParam,以下代码返回错误: “致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:第41行的confirmation.php中不存在1305 PROCEDURE web_events.sp_GetUserID”。同样,第41行是执行。

$stmt = $pdo->prepare("CALL sp_GetUserID(?,?,?)");
$v1 = "tbl_JustSayThanks";
$v2 = "16e90ccf482e72b9a562f5613b659fed";
$v3 = "";
$stmt->bindParam(1,$v1, PDO::PARAM_STR);
$stmt->bindParam(2,$v2, PDO::PARAM_STR);
$stmt->bindParam(3,$v3, PDO::PARAM_INT);
$stmt->execute();
$data = $stmt->fetchAll();
foreach ($data as $row) {
return $row['id_Out'];
}

供参考,以下是wchiquito的存储过程

DROP PROCEDURE IF EXISTS `sp_GetRecordID`;
DELIMITER //
CREATE PROCEDURE `sp_GetRecordID`(
  `tablename_In` VARCHAR(64),
  `formSecret_In` VARCHAR(32),
  OUT `id_Out` BIGINT UNSIGNED
)
BEGIN
  SET @`query` := CONCAT('SELECT `id` INTO @`id_Out`
                          FROM ', `tablename_In` ,' 
                          WHERE `formSecret` = \'', `formSecret_In`, '\'');
  PREPARE `stmt` FROM @`query`;
  EXECUTE `stmt`;
  SET `id_Out` := @`id_Out`,
       @`query` := NULL;
  DEALLOCATE PREPARE `stmt`;
END//
DELIMITER ;

我确信这将是一件简单的事情,但我现在没有看到它,并非常感谢帮助整理它。非常感谢提前。

0 个答案:

没有答案