Làm cách nào để có được ID hồ sơ được chèn lần cuối?


9

Tôi muốn lấy ID hồ sơ cho hàng được chèn cuối cùng trong bảng cơ sở dữ liệu. Tôi đang cố gắng sử dụng db_last_insert_id(), nhưng nó đang ném một ngoại lệ.

Cuộc gọi không mục đích db_last_insert_id()

Làm cách nào để có được ID hồ sơ được chèn lần cuối?


1
Chức năng đó không có sẵn trong D7. drupal.org/node/729970
GoodSp33d

Câu trả lời:


15

Trong Drupal 6, bạn sẽ sử dụng mã tương tự như sau.

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

Mã tương đương Drupal 7 là như sau.

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

Tôi muốn id bản ghi mới được chèn từ một bảng cụ thể từ db. Thực tế tôi cần Người dùng đã đăng ký mới (uid) trong Quy tắc làm thế nào tôi có thể đạt được nó
prashanth

Đừng quên chỉ định tên bảng và tên trường trongfunction db_last_insert_id($table, $field)
Vladislav

10

Nếu bạn không tự kiểm soát truy vấn chèn cụ thể, bạn luôn có thể sử dụng truy vấn SQL cũ đơn giản:

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

Tôi đã thử sử dụng Max (uid), nhưng tôi đang nhận được bản ghi trên bản ghi cuối cùng
prashanth

Sau đó, bản ghi chưa được chèn, vì vậy không có uid mới nào
Clive

Tôi có thể xem bản ghi mới trong cơ sở dữ liệu nhưng tôi không nhận được Id của bản ghi đó
prashanth

Không, điều đó là không thể :) Nếu bạn có thể thấy uid trong cơ sở dữ liệu, việc chọn logic MAX(uid) phải trả lại uid đó. Nếu không, máy chủ MySQL của bạn rất bị hỏng
Clive

Điều đó chỉ có thể xảy ra nếu chức năng của bạn được gọi ngay trước khi bản ghi cuối cùng được chèn.
ЕЕннн

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

$ id chứa id được chèn cuối cùng của bảng. chỉ cần lặp lại $ id.


0

Nếu trước đó một số lý do bạn cần phải nhận được một giá trị trường trước khi chèn nó thì đây là một công việc xung quanh để làm điều đó với.

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

Một mẹo thô, nhưng nó hoạt động:

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

hoặc là

$myInsertID = db_query("INSERT INTO {fred} (fld1,fld2) VALUES ('%s','%s')", array('a','b'), array('return' => Database::RETURN_INSERT_ID));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.