最後に挿入されたレコードIDを取得するにはどうすればよいですか?


9

データベーステーブルに最後に挿入された行のレコードIDを取得したい。を使用しようとしていますdb_last_insert_id()が、例外が発生しています。

未定義の関数の呼び出し db_last_insert_id()

最後に挿入されたレコードIDを取得するにはどうすればよいですか?


1
この機能はD7では使用できません。drupal.org/node/729970
GoodSp33d

回答:


15

Drupal 6では、次のようなコードを使用します。

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

Drupal 7の同等のコードは次のとおりです。

$id = db_insert('mytable')
  ->fields(array(
    'intvar' => 5,
    'stringvar' => 'hello world',
    'floatvar' => 3.14,
  ))
  ->execute();

データベースの特定のテーブルから新しく挿入されたレコードIDが必要です。実際には、ルールに新しく登録されたUserId(uid)が必要です。それを実現するには
prashanth

テーブル名とフィールド名を指定するのを忘れないでくださいfunction db_last_insert_id($table, $field)
Vladislav

10

特定の挿入クエリを自分で制御しない場合は、常に古いSQLクエリを使用できます。

$last_id = db_query('SELECT MAX(id_col) FROM {table}')->fetchField();

Max(uid)を使用してみましたが、最後のレコードより上のレコードを取得しています
2013年

その後、レコードはまだ挿入されていないため、利用可能な新しいuidはありません
クライヴ

データベースで新しいレコードを表示できますが、そのレコードのIDを取得できません
prashanth 2013年

いいえ、それは不可能です:)データベースにuidが表示される場合、論理的に選択するとそのuid MAX(uid) 返されます。そうでない場合、MySQLサーバーは非常に壊れています
Clive

これは、最後のレコードが挿入される直前に関数が呼び出された場合にのみ可能です。
ЕлинЙ.

0
  $id = db_insert('mytable')
       ->fields(array(
       'intvar' => 5,
       'stringvar' => 'hello world',
       'floatvar' => 3.14,
       ))
       ->execute();

$ idには、最後に挿入されたテーブルのIDが含まれます。$ idをエコーするだけです。


0

何らかの理由でフィールドの値を挿入する前に取得する必要がある場合、これは回避策です。

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

粗雑なトリックですが、うまくいきます:

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

または

$myInsertID = db_query("INSERT INTO {fred} (fld1,fld2) VALUES ('%s','%s')", array('a','b'), array('return' => Database::RETURN_INSERT_ID));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.