2013-03-12 7 views
7

Mam zapytanie tak:PDO lastInsertId() zwraca 0, gdy używa się duplikatu aktualizacji klucza?

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

Wtedy kiedy zrobić:

$insert_id = $a->lastInsertId()

Jeśli zapytanie powodzeniem wstawiony wiersz, zwróci identyfikator insert zgodnie z oczekiwaniami, jeśli zaktualizował wiersz, zwróci również zaktualizowany identyfikator wiersza zgodnie z oczekiwaniami (sort). Ale jeśli to nie wstawiło ani nie zaktualizowało niczego, ponieważ wszystko było takie samo, to po prostu zwraca 0.

Domyślam się, że jest to całkiem logiczne domyślne zachowanie, ale czy istnieje sposób na jego zmianę, aby mógł zwrócić identyfikator rząd, który próbował zaktualizować, tak jak to robi, gdy zmienia coś w rzędzie.

Dzięki.

Odpowiedz

16

Istnieje wiele miejsc, aby znaleźć odpowiedź na to, ale specyfika do PDO mogą być utrudniania wyników wyszukiwania ...

Po pierwsze, upewnij się, aby dodać id=LAST_INSERT_ID(id) klauzuli ON DUPLICATE, jak zauważono u dołu z the DOCS. W tym przypadku id jest nazwą kolumny klucza podstawowego (w twoim przypadku może być/nie może być zatytułowany id).

Ponadto może być konieczne podanie argumentu obiektu sekwencji do ->lastInsertId(), aby działało. Napotkałem ten problem w pewnych okolicznościach wcześniej.

+0

Na szczęście/niestety (w zależności od tego, jak na to patrzysz), MySQL ma tylko sekwencję 'AUTO_INCREMENT', więc jeśli nie ma pewnych niestandardowych rozszerzeń, dla' MySQL' '-> lastInsertId()' bez argumentów jest w porządku , w przeciwieństwie do 'PostreSQL' i tym podobne. – Wrikken

2

Nie, ponieważ nie ma wiersza, który "próbuje" zaktualizować. Należy również zachować ostrożność: jeśli wcześniej w tej samej sesji miałeś inne zapytanie wstawiania, możesz uzyskać wartość LAST_INSERT_ID() z poprzedniego zapytania.

Powiązane problemy