Làm cách nào để lấy ID hàng được chèn cuối cùng từ cơ sở dữ liệu WordPress?


94

Plugin WordPress của tôi có một bảng với trường khóa chính AUTO_INCREMENT được gọi là ID. Khi một hàng mới được chèn vào bảng, tôi muốn lấy giá trị ID của phần chèn.

Đặc điểm là sử dụng AJAX để đăng dữ liệu lên máy chủ để chèn vào DB. ID hàng mới được trả lại trong phản hồi AJAX để cập nhật trạng thái máy khách. Có thể nhiều máy khách đang đăng dữ liệu lên máy chủ cùng một lúc. Vì vậy, tôi phải đảm bảo rằng mỗi yêu cầu AJAX nhận được chính xác ID hàng mới để phản hồi.

Trong PHP, có một phương thức gọi là mysql_insert_id cho tính năng này, nhưng nó chỉ hợp lệ với điều kiện chủng tộc nếu đối số là link_identifier của thao tác cuối cùng. Thao tác của tôi với cơ sở dữ liệu là trên $ wpdb. Làm cách nào để giải nén link_identifier từ $ wpdb để đảm bảo mysql_insert_id hoạt động? Có cách nào khác để lấy id hàng được chèn cuối cùng từ $ wpdb không?

Cảm ơn.


Liên kết | tài nguyên được lưu trữ trong $wpdb->dbh, nhưng nó được định nghĩa là protected $dbh;... sou bạn không thể truy cập trực tiếp, do đó, sử dụng câu trả lời dưới đây :)
jave.web

Câu trả lời:


191

Ngay sau khi $wpdb->insert()thực hiện chèn, hãy làm như sau:

$lastid = $wpdb->insert_id;

Bạn có thể tìm thêm thông tin về cách thực hiện mọi thứ theo cách của WordPress trong WordPress codex. Các chi tiết ở trên được tìm thấy ở đây trên trang lớp wpdb


Nó như thế này $lastid = $wpdb->$insert_id :?
Francisco Corrales Morales

"Hàm này trả về false nếu không thể chèn hàng. Nếu không, hàm này trả về số hàng bị ảnh hưởng (sẽ luôn là 1)." Từ: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
Unbreak

1
@unbreak - sai chức năng ở đó ... bạn đang đọc về wpdb-> insert ($ table, $ data, $ format);
jsnfwlr

3
Cũng hữu ích khi biết rằng nếu bạn sử dụng truy vấn $ wpdb->, nó vẫn sẽ gán insert_id.
Dave Scotese

2
không cần thiết, nhưng tôi nghĩ rằng nó cải thiện một chút, câu lệnh được đánh dấu và loại bỏ thụt lề vì nó không bắt buộc đối với một dòng.
kamal pal

14

Đây là cách tôi đã làm điều đó, trong mã của tôi

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

Nhiều biến lớp hơn


1
"Hàm này trả về false nếu không thể chèn hàng. Nếu không, hàm này trả về số hàng bị ảnh hưởng (sẽ luôn là 1)." từ: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
Unbreak

1
Nó hoạt động. Trả $wpdb->queryvề len của các hàng bị ảnh hưởng và $wpdb->insert_idcó id được chèn cuối cùng. Cảm ơn!
Fabio Montefuscolo

Điều này tốt hơn cho tôi, vì tôi muốn nắm bắt các chèn mà nếu không sẽ trả về lỗi do các giá trị cột trùng lặp trên một cột duy nhất. Không có cách nào để INSERT IGNOREvới $wpdb->insertkhông may.
Solomon Closson

@unbreak - Có vẻ như nó đang trả về insert_idcho tôi, không phải số hàng bị ảnh hưởng.
Solomon Closson

0

Những thứ như thế này cũng nên làm:

$last = $wpdb->get_row("SHOW TABLE STATUS LIKE 'table_name'");
$lastid = $last->Auto_increment;

10
Điều này sẽ không gây ra sự cố nếu hai bản ghi được chèn vào cùng một lúc gần như chính xác bởi hai quy trình khác nhau? Cả hai quy trình có thể chèn cùng một lúc (hoặc đủ gần với cùng một thời điểm) để auto_increment sẽ trả về cùng một số cho cả hai quy trình.
Michael Khalili

0

Tôi cần lấy id cách cuối cùng sau khi chèn nó, vì vậy

$lastid = $wpdb->insert_id;

Không phải là một lựa chọn.

Đã làm như sau:

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

-6

Đưa cuộc gọi vào mysql_insert_id()bên trong một giao dịch, nên thực hiện:

mysql_query('BEGIN');
// Whatever code that does the insert here.
$id = mysql_insert_id();
mysql_query('COMMIT');
// Stuff with $id.

4
Điều đó không thực hiện bằng cách sử dụng đối tượng $ wpdb như đã được đề cập trong OP.
jsnfwlr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.