PDO lastInsertID () не работает из-за выполнения нескольких запросов за один вызов - PullRequest
0 голосов
/ 30 сентября 2019

Это странно. Я выполняю запрос только с одним INSERT, которому предшествует инструкция SET. Запрос выглядит примерно так:

SET @discount:=(SELECT discount * :applyDiscount FROM fra_cus WHERE customerID=:customerID AND franchiseID=:franchiseID);

INSERT INTO discounts_applied (unitID, franchiseID, customerID, amount)
    VALUES(:unitID, :franchiseID, :customerID, @discount * :price);

Похоже, что если я подготовлю их как два отдельных запроса PDO, lastInsertID () будет работать нормально ... но если я подготовлю их и выполню в одном выражении,lastInsertID () ничего не возвращает.

Это не конец света, но это раздражает. Кто-нибудь знает, почему это так? Для записи есть причина, по которой мне нужно определить @discount как переменную (относится к триггерам в одной из таблиц). Также все это происходит в рамках более крупной транзакции.

1 Ответ

2 голосов
/ 30 сентября 2019

Прежде всего, я бы настоятельно рекомендовал запускать каждый запрос в отдельном вызове API. Вот как интерфейс прикладного программирования предназначен для работы .

Это не только предотвратит подобные ситуации, но и сделает ваш код во много раз более читабельным и обслуживаемым.

И это сделает ваш код намного безопаснее . Вы можете запустить несколько операторов за один вызов только за счет собственных подготовленных операторов. Какова бы ни была виртуальная эта уязвимость, зачем вообще рисковать?

Почему бы не сделать обычный запрос SELECT вместо SET, получить полученное значение в переменную PHP и затем использовать его среди других переменных, просто через заполнитель? Я не вижу причин, почему должен быть такой сложный способ работы с простыми данными.

В случае, если я не смог убедить вас, причина проста. Вы выполняете два запроса, и первый не вызывает никаких идентификаторов вставки. И очевидно, что вам нужны метаданные этого запроса (ошибки, затронутые строки и т. Д.), А не первый. Итак, вы поняли. И чтобы получить метаданные второго запроса, вы должны запросить базу данных для него. Процесс описан в моей статье: Обработка иллюзий PHP - Единственное правильное руководство по PDO: Выполнение нескольких запросов с PDO . В основном PDOStatement::nextRowset() это то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...