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.