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


9

Я хочу получить идентификатор записи для последней вставленной строки в таблице базы данных. Я пытаюсь использовать db_last_insert_id(), но это исключение.

Обращение к неопределенной функции db_last_insert_id()

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


1
Эта функция недоступна в D7. drupal.org/node/729970
GoodSp33d

Ответы:


15

В Drupal 6 вы будете использовать код, подобный следующему.

db_query("INSERT INTO {mytable} (intvar, stringvar, floatvar) VALUES (%d, '%s', %f)", 5, 'hello world', 3.14);
$id = db_last_insert_id('mytable', 'id_fieldname');

Эквивалентный код Drupal 7 следующий.

$id = db_insert('mytable')
  ->fields(array(
    'intvar' => 5,
    'stringvar' => 'hello world',
    'floatvar' => 3.14,
  ))
  ->execute();

Мне нужен только что вставленный идентификатор записи из конкретной таблицы из базы данных. На самом деле мне нужен недавно зарегистрированный идентификатор пользователя (uid) в Правилах, как я могу его получить
prashanth

Не забудьте указать имя таблицы и имя поля вfunction db_last_insert_id($table, $field)
Владислав

10

Если вы не управляете конкретным запросом вставки самостоятельно, вы всегда можете использовать обычный старый запрос SQL:

$last_id = db_query('SELECT MAX(id_col) FROM {table}')->fetchField();

Я пытался использовать Max (uid), но я получаю запись выше последней записи
prashanth

Тогда запись еще не была вставлена, поэтому нет нового доступного uid
Клайв

Я могу видеть новую запись в базе данных, но у меня нет идентификатора этой записи
prashanth

Нет, это невозможно :) Если вы можете увидеть uid в базе данных, логический выбор MAX(uid) должен вернуть этот uid. Если нет, то ваш сервер MySQL очень сильно сломан
Clive

Это было бы возможно, только если ваша функция вызывается непосредственно перед вставкой последней записи.
Елин Й.

0
  $id = db_insert('mytable')
       ->fields(array(
       'intvar' => 5,
       'stringvar' => 'hello world',
       'floatvar' => 3.14,
       ))
       ->execute();

$ id содержит последний вставленный идентификатор таблицы. просто сделайте echo $ id.


0

Если по какой-либо причине вам необходимо получить значение поля перед его вставкой, то это обходной путь.

function _get_id($tableName, $fieldName) {

    $select = db_select($tableName, 'o');
    $fields = array(
        $fieldName,
    );
    $select->fields('o', $fields);
    $result = $select->orderBy($fieldName)->range(0,1)->execute()->fetchAll();
    return $result[0];
}

$lastId = _get_id('table_name' , 'uid');

0

Грубый трюк, но это работает:

$myInsertID = db_query("INSERT INTO {fred} (fld1,fld2) VALUES ('a','b')", array(), array('return' => Database::RETURN_INSERT_ID));

или

$myInsertID = db_query("INSERT INTO {fred} (fld1,fld2) VALUES ('%s','%s')", array('a','b'), array('return' => Database::RETURN_INSERT_ID));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.