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

9

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

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

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

Prashanth
источник
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();
4life
источник
Мне нужен только что вставленный идентификатор записи из конкретной таблицы из базы данных. На самом деле мне нужен недавно зарегистрированный идентификатор пользователя (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));
Ангус Уокер
источник