2013-03-12 5 views
7

У меня есть запрос вроде следующего:PDO lastInsertId() возвращает 0 при использовании при повторном обновлении ключа?

$a = $members->prepare("insert into a(name) values(:name) 
          on duplicate key update name = :name"); 

Тогда, когда я делаю:

$insert_id = $a->lastInsertId()

Если запрос успешно вставил строку, он возвращает идентификатор вставки, как и ожидалось, если он обновит строку, он также вернет обновленный идентификатор строки, как ожидалось (вроде). Но если он не вставил и не обновлял ничего, потому что все было одинаково, тогда он просто возвращает 0.

Я предполагаю, что это довольно логичное поведение по умолчанию, но есть способ изменить его, чтобы он мог вернуть идентификатор который он пытался обновить, например, когда он действительно что-то изменяет в строке.

Спасибо.

ответ

16

Есть много мест, чтобы найти ответ на это, но специфичность к ПДО может быть мешая результаты поиска ...

Во-первых, убедитесь, чтобы добавить id=LAST_INSERT_ID(id) к статье ON DUPLICATE, как было отмечено в нижней части от the DOCS. id в этом случае является именем столбца вашего первичного ключа (поэтому в вашем случае он может/не может иметь титул id).

Кроме того, вам может потребоваться указать аргумент объекта последовательности до ->lastInsertId(), чтобы он работал. Раньше я сталкивался с этой проблемой в определенных обстоятельствах.

+0

К счастью/к сожалению (в зависимости от того, как вы на это смотрите), MySQL имеет только последовательность 'AUTO_INCREMENT', поэтому, если у него нет нестандартных расширений, для' MySQL' '-> lastInsertId()' без аргументов отлично , вопреки «PostreSQL» и тому подобное. – Wrikken

2

Нет, потому что нет строки, которую он «пытается» обновить. Кроме того, будьте осторожны: если бы у вас был другой запрос на вставку до этого в тот же сеанс, вы могли бы получить значение LAST_INSERT_ID() из предыдущего запроса.

Смежные вопросы