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


98

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

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

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

Спасибо.


Ссылка | ресурс хранится в $wpdb->dbh, но определяется как protected $dbh;... су, вы не можете получить к нему доступ напрямую, поэтому используйте ответ ниже :)
jave.web 04

Ответы:


197

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

$lastid = $wpdb->insert_id;

Более подробную информацию о том, как делать что-то в духе WordPress, можно найти в кодексе WordPress. Вышеуказанные данные были найдены здесь, на странице класса wpdb.


Это так $lastid = $wpdb->$insert_id :?
Франсиско Корралес Моралес,

«Эта функция возвращает false, если строка не может быть вставлена. В противном случае она возвращает количество затронутых строк (которое всегда будет 1)». От: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
разблокировать

1
@unbreak - там неправильная функция ... вы читаете про wpdb-> insert ($ table, $ data, $ format);
jsnfwlr

4
Также полезно знать, что если вы используете $ wpdb-> query, он все равно будет назначать insert_id.
Дэйв Скотез,

2
не было необходимости, но я думаю, что это немного улучшается, оператор выделен и удален отступ, поскольку он не требуется для одной строки.
kamal pal 02

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имеет последний вставленный идентификатор. Благодарность!
Фабио Монтефусколо

Для меня это лучше, потому что я хочу фиксировать вставки, которые в противном случае вернут ошибку из-за повторяющихся значений столбца в уникальном столбце. Там нет никакого способа 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 вернет одно и то же число для обоих процессов.
Майкл Халили

0

Мне нужно было получить последний способ идентификатора после его вставки, поэтому

$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
Это не делается с использованием объекта $ wpdb, как упоминалось в OP.
jsnfwlr
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.