【问题标题】:How to get last inserted row ID from WordPress database?如何从 WordPress 数据库中获取最后插入的行 ID?
【发布时间】:2010-12-07 06:08:20
【问题描述】:

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

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

在 PHP 中,有一个名为 mysql_insert_id 的方法用于此功能。但是,只有当参数为 link_identifier 上次操作。我对数据库的操作是在 $wpdb 上。如何从 $wpdb 中提取 link_identifier 以确保 mysql_insert_id 工作?有没有其他方法可以从 $wpdb 获取最后插入的行 id?

谢谢。

【问题讨论】:

  • 链接|资源存储在$wpdb->dbh,但它被定义为protected $dbh; ...所以你不能直接访问它,因此,使用下面的答案:)

标签: wordpress auto-increment race-condition


【解决方案1】:

在进行插入的$wpdb->insert() 之后,执行以下操作:

$lastid = $wpdb->insert_id;

有关如何以 WordPress 方式做事的更多信息,请参阅 WordPress 法典。以上详细信息可在wpdb class page 上找到

【讨论】:

  • 是这样的吗:$lastid = $wpdb->$insert_id?
  • "如果无法插入行,此函数返回 false。否则,返回受影响的行数(始终为 1)。"来自:codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
  • @unbreak - 函数错误...您正在阅读有关 wpdb->insert( $table, $data, $format );
  • 知道如果你使用$wpdb->query,它仍然会分配insert_id也是有用的。
  • 不是必需的,但我认为它改进了一点,声明突出显示,并删除了缩进,因为它不是单行所必需的。
【解决方案2】:

在我的代码中,我就是这样做的

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

More Class Variables

【讨论】:

  • "如果无法插入行,此函数返回 false。否则,它返回受影响的行数(始终为 1)。"来自:codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
  • 它有效。 $wpdb->query 返回受影响行的 len,$wpdb->insert_id 具有最后插入的 id。谢谢!
  • 这对我来说更好,因为我想捕获插入,否则会由于唯一列上的重复列值而返回错误。不幸的是,没有办法INSERT IGNORE$wpdb->insert
  • @unbreak - 看起来它正在向我返回 insert_id,而不是受影响的行数。
【解决方案3】:

插入后需要获取最后一个id方式,所以

$lastid = $wpdb->insert_id;

不是一个选项。

执行以下操作:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 如果两个不同的进程几乎同时插入两条记录,这不会导致问题吗?两个进程可以同时插入(或足够接近同一时间),因此 auto_increment 将为两个进程返回相同的数字。
    【解决方案5】:

    就像这样:

    global $wpdb;
    $table_name='lorem_ipsum';
    $results = $wpdb->get_results("SELECT * FROM $table_name ORDER BY ID DESC LIMIT 1");
    print_r($results[0]->id);
    

    只需选择所有行,然后按 id 对它们进行 DESC 排序,并仅显示第一行

    【讨论】:

      【解决方案6】:

      像这样在WP中获取最后插入的行ID。

      global $wpdb;
      $order = ['product_name'=>'Computer', 'os_system'=>'Linux'];
      $wpdb->insert('wp_product_orders', $order );
      $last_inserted_id = $wpdb->insert_id;
      

      【讨论】:

        【解决方案7】:

        在事务中调用mysql_insert_id(),应该这样做:

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

        【讨论】:

        • 这不是使用 OP 中提到的 $wpdb 对象。
        猜你喜欢
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2015-03-20
        • 2014-09-10
        • 1970-01-01
        • 2019-11-21
        相关资源
        最近更新 更多