Как получить последний вставленный идентификатор строки из базы данных WordPress?

59

Мой плагин wordpress имеет таблицу с AUTO_INCREMENT полем первичного ключа с идентификатором. Когда в таблицу вставлена ​​новая строка, я хотел бы получить значение ID вставки.

Особенностью является использование AJAX для отправки данных на сервер для вставки в БД. Идентификатор новой строки возвращается в ответе AJAX для обновления состояния клиента. Возможно, что несколько клиентов одновременно отправляют данные на сервер. Итак, я должен убедиться, что каждый запрос AJAX получит в ответ EXACT новый идентификатор строки.

В PHP для этой функции существует метод mysql_insert_id. Но он действителен для условия гонки, только если аргумент link_identifier последней операции. Моя операция с базой данных находится на $wpdb. Как извлечь link_identifier из $wpdb, чтобы убедиться, что mysql_insert_id работает? Есть ли другой способ получить идентификатор последней вставленной строки из $wpdb?

Спасибо.

  • 0
    Ссылка | ресурс хранится в $wpdb->dbh , но он определен как protected $dbh; ... так что вы не можете получить к нему доступ напрямую, поэтому используйте ответ ниже :)
Теги:
race-condition
auto-increment

4 ответа

121
Лучший ответ

Сразу после $wpdb->insert(), который делает вставку, сделайте следующее:

$lastid = $wpdb->insert_id;

Подробнее о том, как делать вещи, можно найти в wordpress codex. Подробности выше были найдены здесь на странице wpdb

  • 0
    Это так: $lastid = $wpdb->$insert_id ?
  • 0
    «Эта функция возвращает false, если строка не может быть вставлена. В противном случае она возвращает количество затронутых строк (которое всегда будет равно 1)». От: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
Показать ещё 5 комментариев
6

Вот как я это сделал, в моем коде

 ...
 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 возвращает $wpdb->query затронутых строк, а $wpdb->insert_id имеет последний вставленный идентификатор. Спасибо!
Показать ещё 2 комментария
0

Что-то вроде этого тоже должно это сделать:

$last = $wpdb->get_row("SHOW TABLE STATUS LIKE 'table_name'");
$lastid = $last->Auto_increment;
  • 8
    Не вызовет ли это проблемы, если две записи будут вставлены практически в одно и то же время двумя разными процессами? Оба процесса могут быть вставлены в одно и то же время (или достаточно близко к одному и тому же времени), так что auto_increment вернет одинаковое число для обоих процессов.
-3

Ввод вызова mysql_insert_id() внутри транзакции должен сделать это:

mysql_query('BEGIN');
// Whatever code that does the insert here.
$id = mysql_insert_id();
mysql_query('COMMIT');
// Stuff with $id.
  • 4
    Это не делается с использованием объекта $ wpdb, как было упомянуто в ОП.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню