Я видел, что этот вопрос задавал много раз, но они все очень длинны, и я просто не могу понять, что они делают … Итак, может кто-нибудь сказать мне, как получить LAST_INSERT_ID()
из этой процедуры в php с использованием PDO:
CREATE TABLE names ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name varchar(50) NOT NULL )
CREATE DEFINER=`root`@`localhost` PROCEDURE `simpleProcedure`(newname varchar(50), OUT returnid INT(11)) BEGIN INSERT INTO names (name) VALUES (newname); SET returnid = LAST_INSERT_ID(); END
$stmt=$db->prepare("CALL simpleProcedure(:name,:returnid)"); $stmt->bindValue(':name',$name,PDO::PARAM_STR); $stmt->bindParam(':returnid',$returnid,PDO::PARAM_INT,11); $stmt->execute(); echo $returnid;
Но, вероятно, очевидно, для кого-то, у кого больше мозговых клеток, чем у меня, это не работает. Любая помощь оценивается.
http://www.php.net/pdo.prepared-statements (пример № 4)
Оказывается, это ошибка, которая длится долгое время … с 2005 года!
Вот исходный отчет об ошибке: с 2005 по 2013 год . И вот новый отчет об ошибке: с 2013 года по настоящее время .
Существуют различные подходы к возврату ответа, я нашел один из них и продемонстрировал его …
«Трюк» заключается в том, что для получения результата из процедуры «mysql». Это «двухэтапный» процесс.
Первая часть – запустить процедуру с вашими входом, а также сообщить, какие переменные MYSQL хранят в результате.
Затем вы запускаете отдельный запрос для выбора этих переменных mysql.
Здесь описано довольно четко: php-call-mysql-хранимые процедуры
Обновление (январь 2017 года):
Ниже приведен пример использования переменных для параметров процедуры «IN», «INOUT» и «OUT» Mysql.
Прежде чем мы начнем здесь несколько советов:
При попытке привязки переменных к параметрам INOUT и OUT вы получите некоторые очень странные ошибки времени выполнения.
Как обычно, я предпочитаю давать больше комментариев, чем требуется;
Среда выполнения (XAMPP):
Исходный код:
CREATE PROCEDURE `demoSpInOutSqlVars`(IN pInput_Param INT, /* PHP Variable will bind to this*/ /* --- */ INOUT pInOut_Param INT, /* contains name of the SQL User variable that will be read and set by mysql */ OUT pOut_Param INT) /* contains name of the SQL User variable that will be set by mysql */ BEGIN /* * Pass the full names of SQL User Variable for these parameters. eg '@varInOutParam' * These 'SQL user variables names' are the variables that Mysql will use for: * 1) finding values * 2) storing results * * It is similar to 'variable variables' in PHP. */ SET pInOut_Param := ABS(pInput_Param) + ABS(pInOut_Param); /* always positive sum */ SET pOut_Param := ABS(pInput_Param) * -3; /* always negative * 3 */ END$$
Соединение с БД:
$db = appDIC('getDbConnection', 'default'); // get the default db connection $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
Примечание. Результат аналогичен EMULATE_PREPARES
= false.
Задайте все переменные PHP, которые будут использоваться:
$phpInParam = 5; $phpInOutParam = 404; /* PHP InOut variable ==> read and should be changed */ $phpOutParam = null; /* PHP Out variable ==> should be changed */
Определение и подготовка вызова процедуры SQL:
$sql = "call demoSpInOut(:phpInParam, @varInOutParam, /* mysql variable name will be read and updated */ @varOutParam)"; /* mysql variable name that will be written to */ $stmt = $db->prepare($sql);
Связать переменные PHP и задать переменные SQL:
1) привязать переменные PHP
$ stmt-> bindParam (': phpInParam', $ phpInParam, PDO :: PARAM_INT);
2) Установите переменные SQL INOUT INOUT
$ db-> exec ("SET @varInOutParam = $ phpInOutParam"); // Это безопасно, поскольку он не выполняется.
Выполните процедуру:
$allOk = $stmt->execute();
Получите переменные SQL в переменные PHP:
$sql = "SELECT @varInOutParam AS phpInOutParam, @varOutParam AS phpOutParam FROM dual"; $results = current($db->query($sql)->fetchAll()); $phpInOutParam = $results['phpInOutParam']; $phpOutParam = $results['phpOutParam'];
Примечание: возможно, не самый лучший способ; – /
Отображение переменных PHP
"$phpInParam:" => "5" "$phpInOutParam:" => "409" "$phpOutParam:" => "-15"
позвольте мне предисловие к этому, сказав, что это предположение, поскольку я НИКОГДА не использую подготовленные заявления …
обычно вы не связываете свой возврат val, вы делаете это
$status = $statement->execute( ); $resultArray = $statement->fetchAll( ); $statement->closeCursor( ); if (!is_array($resultArray)) { return array(); } return $resultArray[0]['returnid'];
возьмите его с солью …