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.