Pobieranie id ostatniego inserta gdy kolumna jest Autoincrement

0

Temat, jak przeglądałem w google, nie nowy. Skrypt php na mojej stronie www wstawia rekord do tabeli z autoincrement. Muszę teraz pobrać w tym skrypcie to id aby updatować inne kolumny. Znalazłem informacje o poleceniu w mysql: SELECT LAST_INSERT_ID() oraz metodzie w php:
mysqli_insert_id()
**
ale

jak zabezpieczyć się przed równoległym dodawaniem wierszy do tej tabeli przez innych internautów odpalających ten skrypt?**
Chodzi o to aby pomiędzy dodaniu inserta a pobraniem id ktoś inny nie dokonał swojego inserta który zmieni wartość pobieranego id. Chyba żadna transakcja mi tu nie pomoże, trzeba by blokować wiersze tabeli (locki), co?

0

Czy jesteś pewny że musisz się zabezpieczać? Z tego co wiem mysql_insert_id() jest powiązane z połączeniem które wykonał użytkownik.

Można to też wywołać w ten sposób, może lepiej wygląda:

<?php
$mysqli = new mysqli('host','user','pass','db');
if ($result = $mysqli->query("INSERT INTO t (field) VALUES ('value');")) {
   echo 'The ID is: '.$mysqli->insert_id;
}
?>
0

Jeżeli jest to bezpieczne od tej strony to nie muszę zabezpieczać dodatkowo. Ale w dokumentacji nic o tym nie piszą:
http://pl.php.net/manual/en/mysqli.insert-id.php
Tylko że to podobno wykorzystuje funkcje mysql LAST_INSERT_ID() a ta sama w sobie nie jest jakoś hermetyzowana.

0

Można zauważyć jeszcze jedną rzecz:

mixed mysqli_insert_id ( mysqli $link )

Ponieważ funkcja przyjmuje jako parametr połączenie, to znaczy że w prosty sposób możemy napisać test sprawdzający czy dobrze zwraca id.
Aby to zrobić możemy otworzyć w jednym skrypcie php dwa połączenia, wykonać osobno dwa inserty i następnie pobrać insert_id podając jako parametr połączenie pierwszego wykonanego inserta. Jeżeli zwracany byłby ID z ostatniej operacji na bazie niezależnie od połączenia, to dostalibyśmy ID drugiego inserta zamiast pierwszego.

Tutaj jest przykład kodu który można użyć do przetestowania: http://stackoverflow.com/questions/3294734/php-mysql-multiple-db-connections-and-mysql-insert-id

0

Dzięki za kod, przetestuję to jutro.
Informację o tym że php wykonuje komendę mysql znalazłem tu:

http://antczak.org/2009/11/pobieranie-id-dodanego-rekordu-w-mysql-oracle-i-postgresql/

0

Odpowiedź na Twoje pytanie (za dokumentacją MySQL): http://dev.mysql.com/doc/refman/5.1/en/information-functions.html

Odnośnie LAST_INSERT_ID():

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.

0

Dzięki za tą informację. : ) Dużo mi to upraszcza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1