Moja wtyczka WordPress ma tabelę z polem klucza podstawowego AUTO_INCREMENT o nazwie ID. Kiedy nowy wiersz jest wstawiany do tabeli, chciałbym uzyskać wartość ID wstawienia.
Funkcja polega na używaniu AJAX do wysyłania danych do serwera w celu wstawienia do bazy danych. Nowy identyfikator wiersza jest zwracany w odpowiedzi AJAX w celu zaktualizowania stanu klienta. Jest możliwe, że wielu klientów przesyła dane na serwer w tym samym czasie. Dlatego muszę się upewnić, że każde żądanie AJAX otrzyma w odpowiedzi DOKŁADNY nowy identyfikator wiersza.
W PHP istnieje metoda o nazwie mysql_insert_id dla tej funkcji, ale jest ona ważna dla warunku wyścigu tylko wtedy, gdy argumentem jest identyfikator_linku ostatniej operacji. Moja operacja z bazą danych jest na $ wpdb. Jak wyodrębnić identyfikatora_połączenia od $ wpdb aby upewnić się, że prace mysql_insert_id? Czy jest jakiś inny sposób uzyskania identyfikatora ostatniego wstawionego wiersza z $ wpdb?
Dzięki.
źródło
$wpdb->dbh
, ale jest zdefiniowany jakoprotected $dbh;
... więc nie możesz uzyskać do niego bezpośredniego dostępu, dlatego użyj odpowiedzi poniżej :)Odpowiedzi:
Zaraz po
$wpdb->insert()
co robi wstawianie, zrób to:Więcej informacji o tym, jak robić rzeczy na sposób WordPress, można znaleźć w kodeksie WordPress. Powyższe szczegóły zostały znalezione tutaj, na stronie klasy wpdb
źródło
$lastid = $wpdb->$insert_id
:?Tak to zrobiłem w moim kodzie
... global $wpdb; $query = "INSERT INTO... VALUES(...)" ; $wpdb->query( $wpdb->prepare($query) ); return $wpdb->insert_id; ...
Więcej zmiennych klas
źródło
$wpdb->query
powroty len z wierszy i$wpdb->insert_id
ma ostatnie wstawiony id. Dzięki!INSERT IGNORE
z$wpdb->insert
niestety.insert_id
do mnie wartość, a nie liczbę wierszy, których dotyczy problem.Coś takiego powinno też to zrobić:
$last = $wpdb->get_row("SHOW TABLE STATUS LIKE 'table_name'"); $lastid = $last->Auto_increment;
źródło
Musiałem uzyskać ostatni identyfikator po włożeniu go, więc
Nie było opcji.
Czy wykonałem następujące czynności:
global $wpdb; $id = $wpdb->get_var( 'SELECT id FROM ' . $wpdb->prefix . 'table' . ' ORDER BY id DESC LIMIT 1');
źródło
Wezwanie
mysql_insert_id()
wewnątrz transakcji powinno to zrobić:mysql_query('BEGIN'); // Whatever code that does the insert here. $id = mysql_insert_id(); mysql_query('COMMIT'); // Stuff with $id.
źródło