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?

prashanth
źródło
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();
4life
źródło
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();
Clive
źródło
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.

Krish
źródło
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');
Stóg
źródło
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));
Angus Walker
źródło