Bagaimana cara mendapatkan ID baris terakhir yang dimasukkan dari database WordPress?

95

Plugin WordPress saya memiliki tabel dengan bidang kunci utama AUTO_INCREMENT yang disebut ID. Saat baris baru dimasukkan ke dalam tabel, saya ingin mendapatkan nilai ID dari penyisipan.

Fiturnya adalah menggunakan AJAX untuk mengirim data ke server untuk dimasukkan ke dalam DB. ID baris baru dikembalikan dalam tanggapan AJAX untuk memperbarui status klien. Ada kemungkinan bahwa beberapa klien memposting data ke server pada saat yang bersamaan. Jadi, saya harus memastikan bahwa setiap permintaan AJAX mendapatkan ID baris baru yang SAMA sebagai tanggapan.

Di PHP, ada metode yang disebut mysql_insert_id untuk fitur ini, tetapi berlaku untuk kondisi balapan hanya jika argumennya adalah link_identifier dari operasi terakhir. Operasi saya dengan database ada di $ wpdb. Bagaimana cara mengekstrak link_identifier dari $ wpdb untuk memastikan mysql_insert_id berfungsi? Apakah ada cara lain untuk mendapatkan id baris yang disisipkan terakhir dari $ wpdb?

Terima kasih.

Morgan Cheng
sumber
Tautan | sumber daya disimpan di $wpdb->dbh, tetapi didefinisikan sebagai protected $dbh;... sou Anda tidak dapat mengaksesnya secara langsung, oleh karena itu, gunakan jawaban di bawah ini :)
jave.web

Jawaban:

191

Langsung setelah $wpdb->insert()memasukkan, lakukan ini:

$lastid = $wpdb->insert_id;

Informasi lebih lanjut tentang bagaimana melakukan berbagai hal dengan cara WordPress dapat ditemukan di kodeks WordPress. Detail di atas ditemukan di sini di halaman kelas wpdb

jsnfwlr
sumber
Apakah seperti ini $lastid = $wpdb->$insert_id :?
Francisco Corrales Morales
"Fungsi ini mengembalikan nilai salah jika baris tidak dapat disisipkan. Jika tidak, ini mengembalikan jumlah baris yang terpengaruh (yang akan selalu 1)." Dari: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
batalkan pemutusan
1
@unbreak - salah fungsi di sana ... Anda membaca tentang wpdb-> insert ($ table, $ data, $ format);
jsnfwlr
4
Juga berguna untuk mengetahui bahwa jika Anda menggunakan $ wpdb-> query, itu akan tetap menetapkan insert_id.
Dave Scotese
2
tidak perlu, tapi saya pikir itu sedikit membaik, pernyataan disorot, dan lekukan dihapus karena tidak diperlukan untuk satu baris.
kamal pal
14

Beginilah cara saya melakukannya, dalam kode saya

 ...
 global $wpdb;
 $query =  "INSERT INTO... VALUES(...)" ;
 $wpdb->query(
        $wpdb->prepare($query)
);
return $wpdb->insert_id;
...

Lebih Banyak Variabel Kelas

Francisco Corrales Morales
sumber
1
"Fungsi ini mengembalikan nilai salah jika baris tidak dapat disisipkan. Jika tidak, ini mengembalikan jumlah baris yang terpengaruh (yang akan selalu 1)." dari: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
batalkan pemutusan
1
Berhasil. The $wpdb->querypengembalian yang len baris yang terkena dampak dan $wpdb->insert_idmemiliki dimasukkan id lalu. Terima kasih!
Fabio Montefuscolo
Ini lebih baik bagi saya, karena saya ingin menangkap sisipan yang sebaliknya akan mengembalikan kesalahan karena nilai kolom duplikat pada kolom unik. Sayangnya tidak ada cara untuk INSERT IGNOREmelakukannya $wpdb->insert.
Solomon Closson
@unbreak - Sepertinya mengembalikan insert_idke saya, bukan jumlah baris yang terpengaruh.
Solomon Closson
0

Sesuatu seperti ini harus melakukannya juga:

$last = $wpdb->get_row("SHOW TABLE STATUS LIKE 'table_name'");
$lastid = $last->Auto_increment;
Martin
sumber
10
Bukankah ini akan menimbulkan masalah jika dua catatan disisipkan pada waktu yang hampir bersamaan oleh dua proses berbeda? Kedua proses dapat disisipkan pada waktu yang sama (atau cukup dekat pada waktu yang sama) sehingga auto_increment akan mengembalikan angka yang sama untuk kedua proses.
Michael Khalili
0

Saya perlu mendapatkan cara id terakhir setelah memasukkannya, jadi

$lastid = $wpdb->insert_id;

Bukan pilihan.

Apakah sebagai berikut:

global $wpdb;
$id = $wpdb->get_var( 'SELECT id FROM ' . $wpdb->prefix . 'table' . ' ORDER BY id DESC LIMIT 1');
Marco Floriano
sumber
-6

Menempatkan panggilan ke mysql_insert_id()dalam transaksi, harus melakukannya:

mysql_query('BEGIN');
// Whatever code that does the insert here.
$id = mysql_insert_id();
mysql_query('COMMIT');
// Stuff with $id.
Ollie Saunders
sumber
4
Itu tidak melakukannya menggunakan objek $ wpdb seperti yang disebutkan di OP.
jsnfwlr