Nid последней созданной ноды

Главные вкладки

Аватар пользователя kinosura kinosura 24 ноября 2009 в 10:41

Подскажите, пожалуйста, в какой таблице базы хранится nid последней созданной ноды? Drupal 6.14
В Drupal 5.* эти данные хранились в {sequences}. В Drupal 6.*, как мне казалось, - в {variable}... но поиск не принёс результата. Возможно, я не там ищу.

PS. Банальный запрос к {node}_nid не предлагать, это совершенно не то, что нужно.

Комментарии

Аватар пользователя sadmin sadmin 24 ноября 2009 в 11:40

"kinosura" wrote:
в какой таблице базы хранится nid последней созданной ноды?
"kinosura" wrote:
запрос к {node}_nid не предлагать

по-моему наблюдаем противоречие

Аватар пользователя kinosura kinosura 24 ноября 2009 в 12:15

Отвечу сразу ivcons и sadmin, спасибо, что откликнулись.
Если использовать такой алгоритм, то возможно следующее недоразумение. Я создаю, например, 20 любых нод. В нодах типа nodetype при этом я задаю автоматическую генерацию заголовка по шаблону nodetype_last_nid_+_1, поскольку мне нужно, чтобы ноды этого типа носили название, содержащее их nid. Всё прекрасно работает, все счастливы.
Но потом я беру и удаляю 5 последних нод. И снова создаю ноды типа nodetype с автогенерящимся заголовкам. И вот ведь беда: nid у этих нод такой как положено, то есть 21, 22, 23 и т.д., а вот в заголовке имеем 16, 17, 18 и т.д. То есть имеем-то всё правильно, мы же взяли самый последний nid из {node}. НО при этом понимаем, что в действительности nid, которые присваиваются вновь создаваемым нодам, берутся из какой-то переменной, которую я не могу найти, поэтому прошу помощи.

Повторюсь, что в Drupal 5.* я решала эту задачу просто, обращаясь к полю node_id в таблице {sequences}. В ранних версиях Drupal 6.* (или в поздних 5.*), как мне помнится, аналогичная переменная хранилась в {variable}. А теперь где искать? Smile

Аватар пользователя kinosura kinosura 25 ноября 2009 в 7:10

спасибо, Goodboy, но я уже использовала этот вариант, у меня эта функция, вставленная в код автогенерящегося заголовка, возвращает значение 0. в причинах пытаюсь разобраться на русском API, но пока там ответа нет.

Аватар пользователя -OC-@drupal.org -OC-@drupal.org 25 ноября 2009 в 14:26

в D6 nid последней ноды нигде отдельно не храниться.
Посему вам в ваших заголовках скорее всего стоит использовать $node->nid.
что касаемо db_last_insert_id(), то все правильно вам возвращает. Эту ф-цию имеет смысл использовать сразу за db_query() в которой создается новая запись в таблицу с полем с автоинкрементом.
ЗЫ Т.к. в d5 в таблице node поле nid не имело автоинкремента, то возникала необходимость где-то хранить значение последнего id . В D6 же node.nid имеет автоинкремент и посему за правильным значением следит сама СУБД.

Звиняйте если несколько сумбурно ответил.

Аватар пользователя goodboy goodboy 25 ноября 2009 в 23:03

Я запускал db_last_insert_id на сайте, на котором производится массированное добавление нод. Видимо, поэтому мне не всегда возвращался 0.

Может, такой вариант сработает:

<?php

function db_last_id($table, $field) {
db_result(db_query("SELECT nextval('%s_seq')", db_prefix_tables($field)));
return db_last_insert_id($table,$field);
}

print db_last_id('node','nid');

?>

Аватар пользователя -OC-@drupal.org -OC-@drupal.org 26 ноября 2009 в 9:38

"Химический Али" wrote:
Есть еще db_next_id(). Рекомендую. При ее использовании не возникнет необходимости делать запрос после вставки.

Эта ф-ция только на D5 существует.
Господа, учите матчасть!!
итак для MySQL смотрим в database.mysql-common.inc

function db_last_insert_id($table, $field) {
  return db_result(db_query('SELECT LAST_INSERT_ID()'));
}

затем смотрим сюда и ВНИМАТЕЛЬНО читаем. Все вопросы отпадут.