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

使用输入和输出参数从php函数调用MySQL存储过程,php,mysql,stored-procedures,pdo,Php,Mysql,Stored Procedures,Pdo,现在,我已经从wchiquito获得了一个很棒的存储过程解决方案,实际上我很难使用它来提取任何数据 我使用带pdo的mysql数据库,传递3个参数(2个输入和1个输出)。我已经按照PHP手册中的示例使用bindValue和bindParam进行了尝试。然而,这两种方法都会导致错误,我看不出这是怎么回事 使用bindValue,以下代码返回错误: “致命错误:未捕获异常'PDOException',第41行的confirmation.php中显示消息'SQLSTATE[HY093]:无效参数编号:

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

我使用带pdo的mysql数据库,传递3个参数(2个输入和1个输出)。我已经按照PHP手册中的示例使用bindValue和bindParam进行了尝试。然而,这两种方法都会导致错误,我看不出这是怎么回事

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

$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'];
}
$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'];
}
使用bindParam,以下代码返回错误: “致命错误:未捕获异常'PDOException',消息'SQLSTATE[42000]:语法错误或访问冲突:第41行confirmation.php中的1305过程web_events.sp_GetUserID不存在”。同样,第41行是execute

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

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

这个程序在哪里?首先,在PDO?中连接到的同一个数据库中,在查询中使用命名占位符似乎是合理的,例如中的
:tablename_,而不是第一个
,等等。。。但是更改这一点也可能导致第二个错误,因为听起来您可能无意中在错误的模式中创建了过程<代码>显示过程状态,如“sp_GetUserID”应该告诉你它在哪里。好吧,我是个白痴-这个过程应该是sp_GetRecordID而不是sp_GetUserID-我只是没看到。我正在将所有基于web的表单从MSSQL转换为MySQL,并且正在做一些改变。也就是说,一旦我做了更改,我会得到一个新的错误:“致命错误:未捕获的异常‘PDOException’,带有消息‘SQLSTATE[42000]:语法错误或访问冲突:例程gsnetx_web_events.sp_GetRecordID的1414 OUT或INOUT参数3在BEFORE trigger‘in confirmation.php的第44行’中不是一个变量或新的伪变量,我知道了如何让它工作,但基于pdo过程和mysql的文档,它不应该工作。当输出变量在数据库中工作时,通过消除存储过程中的输出变量并只传入输入变量,我能够使所有变量都正常工作。根据文件,这不应该起作用,但它起作用了。这个过程在哪里?首先,在PDO?中连接到的同一个数据库中,在查询中使用命名占位符似乎是合理的,例如
中的
:tablename_,而不是第一个
,等等。。。但是更改这一点也可能导致第二个错误,因为听起来您可能无意中在错误的模式中创建了过程<代码>显示过程状态,如“sp_GetUserID”应该告诉你它在哪里。好吧,我是个白痴-这个过程应该是sp_GetRecordID而不是sp_GetUserID-我只是没看到。我正在将所有基于web的表单从MSSQL转换为MySQL,并且正在做一些改变。也就是说,一旦我做了更改,我会得到一个新的错误:“致命错误:未捕获的异常‘PDOException’,带有消息‘SQLSTATE[42000]:语法错误或访问冲突:例程gsnetx_web_events.sp_GetRecordID的1414 OUT或INOUT参数3在BEFORE trigger‘in confirmation.php的第44行’中不是一个变量或新的伪变量,我知道了如何让它工作,但基于pdo过程和mysql的文档,它不应该工作。当输出变量在数据库中工作时,通过消除存储过程中的输出变量并只传入输入变量,我能够使所有变量都正常工作。根据文件,这不应该起作用,但它确实起作用了。