Como obtenho o último ID de registro inserido?

9

Quero obter o ID do registro para a última linha inserida em uma tabela de banco de dados. Estou tentando usar db_last_insert_id(), mas está lançando uma exceção.

Chamada para função indefinida db_last_insert_id()

Como obtenho o último ID de registro inserido?

prashanth
fonte
11
Essa função não está disponível no D7. drupal.org/node/729970
GoodSp33d

Respostas:

15

No Drupal 6, você usaria código semelhante ao seguinte.

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

O código equivalente do Drupal 7 é o seguinte.

$id = db_insert('mytable')
  ->fields(array(
    'intvar' => 5,
    'stringvar' => 'hello world',
    'floatvar' => 3.14,
  ))
  ->execute();
4life
fonte
Eu quero recém-inserido ID de registro de uma tabela especial do db.Actually I necessidade recém-registrado UserId (uid) em Regras como eu posso conseguir isso
prashanth
Não se esqueça de especificar o nome da tabela eo nome campo nafunction db_last_insert_id($table, $field)
Vladislav
10

Se você não controla a consulta de inserção específica, pode sempre usar uma consulta SQL simples e antiga:

$last_id = db_query('SELECT MAX(id_col) FROM {table}')->fetchField();
Clive
fonte
Eu tentei usar Max (uid), mas eu estou recebendo o registro acima do recorde anterior
prashanth
Então o registro ainda não foi inserido, então não há novo uid disponível
Clive
Eu sou capaz de ver o novo registro no banco de dados, mas eu não estou recebendo o Id desse registro
prashanth
Não, isso é impossível :) Se você pode ver o uid no banco de dados, selecionar logicamente MAX(uid) deve retornar esse uid. Caso contrário, seu servidor MySQL está muito, muito quebrado
Clive
Isso seria possível apenas se sua função for chamada imediatamente antes da inserção do último registro.
Елин Й.
0
  $id = db_insert('mytable')
       ->fields(array(
       'intvar' => 5,
       'stringvar' => 'hello world',
       'floatvar' => 3.14,
       ))
       ->execute();

$ id contém o último ID inserido da tabela. apenas faça eco de $ id.

Krish
fonte
0

Se, por algum motivo, você precisar obter um valor de campos antes de inseri-lo, é uma maneira de contornar isso.

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');
Rick
fonte
0

Um truque bruto, mas funciona:

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

ou

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