MySQL извлекает переменную из хранимой процедуры в PHP PDO

Я видел, что этот вопрос задавал много раз, но они все очень длинны, и я просто не могу понять, что они делают … Итак, может кто-нибудь сказать мне, как получить 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 

Код PHP, который я пробовал:

 $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.

Прежде чем мы начнем здесь несколько советов:

  • При разработке: Запустите PDO в режиме эмулирования, поскольку он более надежен при определении ошибок в вызове процедуры.
  • Свяжите только переменные PHP с параметрами процедуры «IN».

При попытке привязки переменных к параметрам INOUT и OUT вы получите некоторые очень странные ошибки времени выполнения.

Как обычно, я предпочитаю давать больше комментариев, чем требуется;

Среда выполнения (XAMPP):

  • PHP: 5.4.4
  • Mysql: 5.5.16

Исходный код:

  • Процедура SQL
  • PHP с выходом

Код SQL:

 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$$ 

Код PHP:

Соединение с БД:

 $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']; 

возьмите его с солью …