PHP - > PDO - >准备 - >通话程序 - >插入 - >绑定参数

时间:2016-01-28 17:10:05

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

使用此程序

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语句和绑定参数调用过程?

谢谢

1 个答案:

答案 0 :(得分:2)

$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(?,?,?)');