【问题标题】:PHP -> PDO -> Prepare -> Call Procedure -> Insert Into -> Bind ParametersPHP -> PDO -> 准备 -> 调用过程 -> 插入 -> 绑定参数
【发布时间】:2016-05-06 04:41:43
【问题描述】:

使用这个程序

CREATE PROCEDURE `Insert_New_Return_Id`(IN Insert_Stmnt varchar(1000), OUT IDNum int)
BEGIN
    SET @buffer = Insert_Stmnt;
    PREPARE stmt FROM @buffer;
    EXECUTE stmt;
    SELECT LAST_INSERT_ID() INTO IDNum;
    DEALLOCATE PREPARE stmt;
END 

以下代码可以正常工作:

$statement=$con->prepare("CALL Insert_New_Return_Id (\"INSERT INTO users (first_name,last_name)VALUES('test','test')\",@ID)");
$statement->execute();
$statement=$con->query("SELECT @ID");
while ($row = $statement->fetch()){echo "Last ID Insert : " . $row['@ID'];}

但是当我尝试绑定参数时,值是?

$first_name = "test";
$last_name = "test";    
$statement=$con->prepare("CALL Insert_New_Return_Id (\"INSERT INTO users (first_name,last_name)VALUES('?','?')\",@ID)");
    $statement->bindParam(1, $first_name, PDO::PARAM_STR);
    $statement->bindParam(2, $last_name, PDO::PARAM_STR);
    $statement->execute();
    $statement=$con->query("SELECT @ID");
    while ($row = $statement->fetch()){echo "Last ID Insert : " . $row['@ID'];}

如果我尝试VALUES(?,?) 返回错误。

我怎样才能做到这一点?调用带有prepare语句和绑定参数的过程?

谢谢

【问题讨论】:

  • 不要将参数放在引号中。
  • 我也尝试了 VALUES(?,?) 但返回错误。
  • DELIMITER // 如果存在则删除过程 Insert_New_Return_Id 创建过程 Insert_New_Return_Id(IN Insert_Stmnt varchar(1000), OUT IDNum int) BEGIN SET @buffer = Insert_Stmnt;从@buffer准备stmt;执行语句;选择 LAST_INSERT_ID() INTO IDNum; DEALLOCATE PREPARE stmt; END // 分隔符 ;
  • 程序正常
  • 您收到什么错误?将其粘贴到您的问题中

标签: php stored-procedures pdo prepared-statement bindparam


【解决方案1】:
$statement->bindParam(1, 'test', PDO::PARAM_STR);
$statement->bindParam(2, 'test', PDO::PARAM_STR);

您必须使用变量而不是字符串“test”。 PDOStatement::bindParam 通过引用绑定变量。根据定义,您不能对字符串执行此操作。 请改用变量。

$statement->bindParam(1, $str1, PDO::PARAM_STR);
$statement->bindParam(2, $str2, PDO::PARAM_STR);

另外,当您想使用CALL 调用存储过程时,只需按名称调用存储过程即可。不要重复查询。当然,这假设您已经完成了将存储过程添加到 MySQL 的工作。

$statement=$con->prepare('CALL Insert_New_Return_Id(?,?)');

如果需要第三个参数,添加到MySQL的存储过程中,这样调用。

$statement=$con->prepare('CALL Insert_New_Return_Id(?,?,?)');

【讨论】:

  • 我不能使用 $statement=$con->prepare('CALL Insert_New_Return_Id(?,?)');因为在 () 中我必须写“INSERT INTO users (first_name,last_name)VALUES(?,?)”
  • @GaLaTaS 这一定是我从未见过的 MySQL 的一个特性。如果可能,尝试在 MySQL 内部定义查询,以便您可以从单个接口调用存储过程。
  • @RyanVincent 包括字符串吗?
猜你喜欢
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2016-11-29
  • 2016-09-04
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多