Як отримати ідентифікатор останнього вставленого рядка з бази даних WordPress?


95

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

Особливість полягає у використанні AJAX для розміщення даних на сервері для вставки в БД. Ідентифікатор нового рядка повертається у відповіді AJAX для оновлення стану клієнта. Можливо, кілька клієнтів одночасно розміщують дані на сервері. Отже, я повинен переконатися, що кожен запит AJAX отримує у відповідь ТОЧНО новий ідентифікатор рядка.

У PHP для цієї функції існує метод, який називається mysql_insert_id , але він дійсний для стану перегонів лише в тому випадку, якщо аргументом є link_identifier останньої операції. Моя робота з базою даних здійснюється на $ wpdb. Як витягти link_identifier з $ wpdb, щоб переконатися, що mysql_insert_id працює? Чи є інший спосіб отримати ідентифікатор останнього вставленого рядка з $ wpdb?

Дякую.


Посилання | ресурс зберігається в $wpdb->dbh, але воно визначається як protected $dbh;... тому що ви не можете безпосередньо отримати до нього доступ, отже, використовуйте відповідь нижче :)
jave.web

Відповіді:


191

Прямо після того, $wpdb->insert()що робить вставка, зробіть наступне:

$lastid = $wpdb->insert_id;

Більше інформації про те, як робити речі за допомогою WordPress, можна знайти в кодексі WordPress. Вище деталі знайдено тут на сторінці класу wpdb


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

"Ця функція повертає значення false, якщо рядок не вдалося вставити. В іншому випадку вона повертає кількість уражених рядків (яке завжди буде 1)." Від: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
Unbreak

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

4
Також корисно знати, що якщо ви використовуєте $ wpdb-> query, він все одно призначить insert_id.
Дейв Скотез,

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
Unbreak

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 повертав однакове число для обох процесів.
Michael Khalili

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.