现在我已经从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 ;
我确信这将是一件简单的事情,但我现在没有看到它,并非常感谢帮助整理它。非常感谢提前。