Jak uzyskać ostatni wstawiony identyfikator rekordu?


9

Chcę uzyskać identyfikator rekordu dla ostatniego wstawionego wiersza w tabeli bazy danych. Próbuję użyć db_last_insert_id(), ale rzuca wyjątek.

Wywołanie niezdefiniowanej funkcji db_last_insert_id()

Jak uzyskać ostatni wstawiony identyfikator rekordu?


1
Ta funkcja nie jest dostępna w D7. drupal.org/node/729970
— GoodSp33d

Odpowiedzi:


15

W Drupal 6 używałbyś kodu podobnego do następującego.

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');

Odpowiednik kodu Drupal 7 jest następujący.

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

Chcę nowo wstawiony identyfikator rekordu z konkretnej tabeli z bazy danych. Właściwie potrzebuję nowo zarejestrowanego identyfikatora użytkownika (UID) w Regułach, w jaki sposób mogę go uzyskać
— prashanth

Nie zapomnij podać nazwy tabeli i nazwy pola wfunction db_last_insert_id($table, $field)
— Vladislav

10

Jeśli nie kontrolujesz konkretnego zapytania wstawiania, zawsze możesz użyć zwykłego starego zapytania SQL:

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

Próbowałem użyć Max (UID), ale otrzymuję rekord powyżej ostatniego rekordu
— prashanth

Następnie rekord nie został jeszcze wstawiony, więc nie ma nowego UID
— Clive

Mogę zobaczyć nowy rekord w bazie danych, ale nie otrzymuję identyfikatora tego rekordu
— prashanth

Nie, to niemożliwe :) Jeśli widzisz identyfikator użytkownika w bazie danych, logiczne wybranie go MAX(uid) musi zwrócić. Jeśli nie, twój serwer MySQL jest bardzo zepsuty
— Clive

Byłoby to możliwe tylko wtedy, gdy twoja funkcja zostanie wywołana tuż przed wstawieniem ostatniego rekordu.
— Елин Й.

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

$ id zawiera ostatni wstawiony identyfikator tabeli. po prostu zrób echo $ id.


0

Jeśli z jakiegoś powodu musisz uzyskać wartość pola przed wstawieniem, jest to obejście tego problemu.

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

Prymitywna sztuczka, ale działa:

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

lub

$myInsertID = db_query("INSERT INTO {fred} (fld1,fld2) VALUES ('%s','%s')", array('a','b'), array('return' => Database::RETURN_INSERT_ID));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.