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?


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

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

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.


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

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));
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.