PHP->;PDO->;准备->;呼叫程序->;插入到->;绑定参数

PHP->;PDO->;准备->;呼叫程序->;插入到->;绑定参数,php,stored-procedures,pdo,prepared-statement,bindparam,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; EN

使用此程序

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'];}
如果我尝试
值(?),则返回一个错误

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

多谢各位

$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(?,?,?)');
必须使用变量而不是字符串“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(?,?,?)');

不要将参数放在引号中。我也尝试使用值(?),但返回一个错误。如果存在分隔符//删除过程
Insert\u New\u Return\u Id
CREATE过程
Insert\u New\u Return\u Id
(在Insert\u Stmnt varchar(1000)中,OUT IDNum int)开始设置@buffer=Insert\u Stmnt;从@buffer准备stmt;执行stmt;在IDNum中选择LAST_INSERT_ID();解除分配准备stmt;结束//分隔符;程序运行良好,您遇到了什么错误?将其粘贴到您的问题中。不要将参数放在引号中。我也会尝试值(?),但返回一个错误。分隔符//如果存在,则删除过程
Insert\u New\u Return\u Id
CREATE PROCEDURE
Insert\u New\u Return\u Id
(在Insert\u Stmnt varchar(1000)中,OUT IDNum int)BEGIN SET@buffer=Insert\u Stmnt;从@buffer准备stmt;执行stmt;在IDNum中选择LAST_INSERT_ID();解除分配准备stmt;结束//分隔符;程序运行良好,您遇到了什么错误?将其粘贴到您的问题中我不能使用$statement=$con->prepare('CALL Insert_New_Return_Id(?));因为在()中我必须写“插入用户(名字,姓氏)值(?,)”@GaLaTaS,这一定是MySQL的一个功能,我从未见过。如果可能,请尝试在MySQL内部下面定义查询,以便您可以从单个接口调用存储过程。@RyanVincent,包括字符串?我不能使用$statement=$con->prepare('call Insert\u New\u Return\u Id(?));因为在()中我必须写“插入用户(名字,姓氏)值(?,)”@GaLaTaS,这一定是MySQL的一个功能,我从未见过。如果可能,请尝试在MySQL内部定义下面的查询,以便您可以从单个接口调用存储过程。@RyanVincent是否包含字符串?