Skocz do zawartości
Zaloguj się, aby obserwować  
MiSi3kK

problem z LAST_INSERT_ID()

Polecane posty

Cześć,

 

od jakiegoś czasu mam dziwne problemy z MySQL.

Zaczęło się od błędnego działania mysql_insert_id() w php. Przykładowo: wykonuję w php insert, a natychmiast po nim sprawdzam tą funkcją id. Prawdziwe id to 102, a funkcja zwraca np 146.

 

Następnie spróbowałem z SELECT LAST_INSERT_ID() - zwraca wiele wyników, same zera.

 

 

Co może powodować takie dziwne zachowanie mysql? Bo nie mam już pomysłu na obejście tego

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

a ID jest autoincrement? chociaż nie wiem czy to coś zmienia. Może po tym insercie zrób coś w stylu

select id from table order by id desc limit 1 - to by tak na około było ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

autoincrement jest

 

Chyba testowo przekompiluję mysql, bo pisanie wszędzie dziwnych zapytań tylko w celu pobrania ostatniego id mija się z celem

 

EDIT: Dzięki za pomysł, do momentu rozwiązania problemu mogę go stosować

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Używając Last_Insert_ID musisz pamiętać, że po 1) to nie jesteś sam na serwerze bazodanowym, i serwer pomiędzy twoimi dwoma zapytaniami może wykonać jakieś inne.

Dlatego jeśli już coś takiego chcesz otrzymywać, to musisz robić to w jednym zapytaniu:

$sql_query = 'INSERT (...); SELECT LAST_INSERT_ID();';

 

A druga sprawa, to zwróci ci to ID _pierwszego_ z dodanych wielu rekordów (czyli jak dodasz więcej niż jeden, to tego PIERWSZEGO dodanego ;) )

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Używając Last_Insert_ID musisz pamiętać, że po 1) to nie jesteś sam na serwerze bazodanowym, i serwer pomiędzy twoimi dwoma zapytaniami może wykonać jakieś inne.

Dlatego jeśli już coś takiego chcesz otrzymywać, to musisz robić to w jednym zapytaniu:

$sql_query = 'INSERT (...); SELECT LAST_INSERT_ID();';

 

Czysta bzdura.

Cytat z dokumentacji MySQL:

"The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions. "

 

Źródło: http://dev.mysql.com/doc/refman/5.0/en/inf..._last-insert-id

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

W takiej sytuacji mogę za to spokojnie wykonać

SELECT last_insert_id() FROM tabela

i nie powinno być problemu.

 

Zresztą to i tak nie tłumaczy błędnego działania mysql_insert_id(). Teoretycznie może to być problem z pconnect, ale nie powinno się to wtedy tak często powtarzać.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

Zaloguj się, aby obserwować  

×