2009-10-16 117 views
62

我的wordpress插件有一个AUTO_INCREMENT称为ID的主键字段。当一个新行插入到表中时,我想要获取插入的ID值。如何从wordpress数据库获取最后插入的行ID?

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

在PHP中,有一个叫mysql_insert_id此feature.But方法,它是有效的竞争条件仅当参数是link_identifier上次操作。我对数据库的操作在$ wpdb上。如何从$ wpdb中提取link_identifier以确保mysql_insert_id正常工作?有没有其他方法可以从$ wpdb获取最后插入的行ID?

谢谢。

+0

的链接|资源存储在'$ wpdb-> dbh'中,但它被定义为'protected $ dbh;'... sou不能直接访问它,因此,请使用下面的答案:) – 2016-06-04 12:38:09

回答

128

,做到这一点:关于如何做的事情

$lastid = $wpdb->insert_id; 

更多信息WordPress的方式可以在wordpress codex中找到。细节以上在这里被发现的wpdb class page

+0

是这样的:'$ lastid = $ wpdb - > $ insert_id'? – 2014-02-11 17:23:19

+0

“如果行不能被插入,则此函数返回false,否则返回受影响的行数(它总是为1)。”来自:http://codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows – unbreak 2015-03-25 12:59:12

+1

@unbreak - 那里有错误的功能......你正在阅读关于wpdb-> insert($ table,$ data,$ format); – jsnfwlr 2015-04-29 03:34:52

-2

把呼叫mysql_insert_id()一个事务中,应该这样做:这确实插入了$wpdb->insert()后直

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

这就是n不要使用OP中提到的$ wpdb对象。 – jsnfwlr 2009-10-16 02:01:14

0

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

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

如果在两个不同的进程几乎完全相同的时间插入两条记录,会不会造成问题?两个进程可以同时插入(或足够接近同一时间),这样auto_increment将为这两个进程返回相同的数字。“ – 2013-09-08 05:54:18

7

这是我做到了,在我的代码

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

More Class Variables

+1

”如果不能插入该行,则此函数返回false,否则返回受影响的行数(始终为1)。“来自:http://codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows – unbreak 2015-03-25 13:01:48

+1

它的工作原理。 '$ wpdb-> query'返回受影响行的len,'$ wpdb-> insert_id'返回最后一个插入的id。谢谢! – 2015-09-29 20:26:51

+0

这对我来说更好,因为我想要捕获插入,否则会因唯一列上的重复列值而返回错误。不幸的是,''wpdb-> insert'无法'INSERT IGNORE'。 – 2018-02-15 01:50:13

相关问题