如何从WordPress数据库中获取最后插入的行ID?


94

我的WordPress插件有一个表,表中有一个名为ID 的AUTO_INCREMENT主键字段。当在表中插入新行时,我想获取插入的ID值。

该功能是使用AJAX将数据发布到服务器以插入到DB中。在AJAX响应中返回新的行ID,以更新客户端状态。多个客户端可能同时将数据发布到服务器。因此,我必须确保每个AJAX请求都获得确切的新行ID作为响应。

在PHP中,有一个名为mysql_insert_id的方法用于此功能,但是,仅当参数是最后一次操作的link_identifier时才对竞争条件有效。我对数据库的操作在$ wpdb上。如何从$ wpdb中提取link_identifier以确保mysql_insert_id工作?还有其他方法可以从$ wpdb获取最后插入的行ID吗?

谢谢。


链接|资源存储在中$wpdb->dbh,但是它定义为protected $dbh;... sou,您无法直接访问它,因此,请使用以下答案:)
jave.web

Answers:


191

$wpdb->insert()执行插入操作之后,直接执行以下操作:

$lastid = $wpdb->insert_id;

可以在WordPress代码库中找到有关如何以WordPress方式进行操作的更多信息。上面的详细信息在wpdb类页面上找到


是这样的 $lastid = $wpdb->$insert_id 吗?
Francisco Corrales Morales 2014年

“如果无法插入行,此函数将返回false。否则,它将返回受影响的行数(始终为1)。” 来自:codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
破门

1
@unbreak-错误的函数...您正在阅读有关wpdb-> insert($ table,$ data,$ format);
jsnfwlr 2015年

4
知道如果您使用$ wpdb-> query,它仍然会分配insert_id,这也很有用。
Dave Scotese 2015年

2
不必要,但我认为它有所改进,突出显示了语句,并删除了缩进,因为单行不需要。
kamal pal

14

这就是我这样做的方式

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

更多类变量


1
“如果无法插入行,此函数将返回false。否则,它将返回受影响的行数(始终为1)。” 来自:codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
破门

1
有用。在$wpdb->query返回len个受影响的行和$wpdb->insert_id具有最后插入的ID。谢谢!
Fabio Montefuscolo 2015年

这对我来说更好,因为我想捕获插入,否则由于唯一列上的列值重复而将返回错误。有没有办法INSERT IGNORE$wpdb->insert不幸。
所罗门·克洛森

@unbreak-看起来像是在insert_id向我返回,而不是受影响的行数。
所罗门·克洛森

0

这样的事情也应该这样做:

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

10
如果两个不同的进程几乎在同一时间插入了两个记录,这不会引起问题吗?两个进程可以同时插入(或足够接近同一时间),以便auto_increment将为两个进程返回相同的编号。
Michael Khalili

0

我需要在插入后获得最后的id方式,所以

$lastid = $wpdb->insert_id;

别无选择。

是否执行以下操作:

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

-6

将调用mysql_insert_id()放入事务内部,应该这样做:

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

4
如OP中所提到的,这不是使用$ wpdb对象来完成的。
jsnfwlr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.