2016-01-28 1 views
0

с помощью этой процедурыPHP -> PDO -> Подготовка -> Вызов процедуры -> Вставить Into -> Bind Параметры

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(?,?) возвращает ошибку.

Как я могу сделать эту работу? Вызвать процедуру с инструкцией подготовки и параметрами привязки?

Спасибо

+1

Не ставьте параметры в кавычки. –

+0

Я также пытаюсь VALUES (?,?), Но возвращает ошибку. – GaLaTaS

+0

DELIMITER // DROP ПРОЦЕДУРА IF EXISTS 'Insert_New_Return_Id' CREATE PROCEDURE' Insert_New_Return_Id' (ВО Insert_Stmnt VARCHAR (1000), OUT IDNum INT) BEGIN, SET @buffer = Insert_Stmnt; PREPARE stmt FROM @buffer; EXECUTE stmt; \t SELECT LAST_INSERT_ID() В IDNum; DEALLOCATE PREPARE stmt; END // DELIMITER; – GaLaTaS

ответ

2
$statement->bindParam(1, 'test', PDO::PARAM_STR); 
$statement->bindParam(2, 'test', PDO::PARAM_STR); 

Вы должны использовать переменную вместо строки «тест». 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(?,?,?)'); 
+0

Я использую его так, как раз в примере, я его пишу .. – GaLaTaS

+0

Я не могу использовать $ statement = $ con > prepare ('CALL Insert_New_Return_Id (?,?)'), потому что в() мне нужно написать «INSERT INTO users (first_name, last_name) VALUES (?,?)» – GaLaTaS

+0

@GaLaTaS Это должна быть функция MySQL I никогда не видели. Если возможно, попытайтесь определить запрос ниже внутри MySQL, чтобы вы могли вызвать хранимую процедуру из одного интерфейса. –