Làm cách nào để lấy ID được chèn cuối cùng của bảng MySQL trong PHP?


93

Tôi có một bảng mà dữ liệu mới thường xuyên được chèn vào. Tôi cần lấy ID cuối cùng của bảng. Tôi có thể làm cái này như thế nào?

Nó tương tự với SELECT MAX(id) FROM table?


1
có, bạn truy vấn này sẽ trả về id cuối cùng của bảng. Nhưng một điều kiện là ID phải là Khóa chính. Vì vậy, bạn có thể tránh ăn năn.
sathish

7
@sathish: Vấn đề chính của phương pháp đó là tính đồng thời .
CMS

3
Nói rõ hơn: Vấn đề với nó là nếu ai đó khác chèn một cái gì đó vào bảng giữa INSERTtruy vấn của bạn và cho MAX(id), bạn có thể nhận được một id không phải là id cuối cùng của bạn .
deceze

3
@Jocelyn câu hỏi đó được hỏi một năm sau đó với hàng nghìn lượt xem ít hơn câu hỏi này.
Naftali aka Neal

3
@Neal, bạn nói đúng. Câu hỏi khác nên được đóng lại vì bản sao của câu hỏi này.
Jocelyn

Câu trả lời:


133

Nếu bạn đang sử dụng PDO, hãy sử dụng PDO::lastInsertId.

Nếu bạn đang sử dụng Mysqli, hãy sử dụng mysqli::$insert_id.

Nếu bạn vẫn đang sử dụng Mysql:

Vui lòng không sử dụng các mysql_*chức năng trong mã mới . Chúng không còn được duy trì và chính thức không được dùng nữa . Nhìn thấy ô màu đỏ ? Thay vào đó, hãytìm hiểu về các câu lệnh đã chuẩn bị và sử dụng PDO hoặc MySQLi - bài viết này sẽ giúp bạn quyết định điều đó. Nếu bạn chọn PDO, đây là một hướng dẫn tốt .

Nhưng nếu bạn phải sử dụng mysql_insert_id.


Vấn đề với cái này là nếu bạn có nhiều lần chèn xảy ra (ví dụ: cơ sở dữ liệu của bạn cũng ghi lại một cái gì đó), bạn có thể nhận được ID sai.
Mike

@Mike Không nếu bạn sử dụng mysql_insert_id ngay sau của bạn mysql_query. Tất nhiên, nếu bạn thực hiện một số truy vấn khác trên cùng một kết nối ở giữa, thì không có gì có thể giúp bạn ở đó.
lừa dối

7
Để đảm bảo rằng bạn sẽ KHÔNG BAO GIỜ nhận được một id sai, hãy bọc mã của bạn bằng một GIAO DỊCH .
Marcelo Assis

28
mysql đảm bảo đây là id cuối cùng CỦA KẾT NỐI HIỆN TẠI, vì vậy sẽ không có vấn đề gì nếu bạn đặt câu lệnh này ngay sau truy vấn chèn. Không phải lo lắng về các quy trình khác thực hiện chèn. Không cần phải kết thúc điều này trong một giao dịch. Hướng dẫn sử dụng mysql cho biết: "ID đã được tạo được duy trì trong máy chủ trên cơ sở mỗi kết nối. Điều này có nghĩa là giá trị được hàm trả về cho một ứng dụng khách nhất định là giá trị AUTO_INCREMENT đầu tiên được tạo cho câu lệnh gần đây nhất ảnh hưởng đến cột AUTO_INCREMENT bởi khách hàng đó . Đây là lý do bạn không nên sử dụng chọn MAX (ID)
woens

1
@deceze, PDOChúng ta thấy ở đâu cũng có sự thiên vị này ? Chúng ta hãy nhìn vào so sánh các tính năng một lần nữa. Rõ ràng đó mysqlilà người chiến thắng khi bạn cần phải làm bẩn tay với những thứ cấp thấp. Nói cách khác, ngay cả khi một người chọn PDO, cuối cùng anh ta vẫn cần sử dụng mysqli.
Pacerier

53

có một chức năng để biết id cuối cùng được chèn vào kết nối hiện tại là gì

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

cộng với việc sử dụng max là một ý tưởng tồi vì nó có thể dẫn đến sự cố nếu mã của bạn được sử dụng cùng lúc trong hai phiên khác nhau.

Hàm đó được gọi là mysql_insert_id


2
mysql _ (...) không được chấp nhận trong phiên bản PHP> = 5.5.
Iago

Đúng, tôi chỉ nhớ điều đó. :)
Iago


18

Với PDO :

$pdo->lastInsertId();

Với Mysqli :

$mysqli->insert_id;

Vui lòng không sử dụng các mysql_*chức năng trong mã mới . Chúng không còn được duy trì và chính thức không được dùng nữa . Nhìn thấy ô màu đỏ ? Thay vào đó, hãytìm hiểu về các câu lệnh đã chuẩn bị và sử dụng PDO hoặc MySQLi - bài viết này sẽ giúp bạn quyết định điều đó. Nếu bạn chọn PDO, đây là một hướng dẫn tốt .



8

Những gì bạn đã viết sẽ mang lại cho bạn điều tuyệt vời nhất idgiả sử chúng là duy nhất và tự động tăng dần, điều đó sẽ ổn nếu bạn ổn với việc mời các vấn đề đồng thời.
Vì bạn đang sử dụng MySQL làm cơ sở dữ liệu của mình, nên có một chức năng cụ thể LAST_INSERT_ID()chỉ hoạt động trên kết nối hiện tại đã chèn.
PHP cung cấp một hàm cụ thể cho cái quá được gọi đó mysql_insert_id.


6

Hãy thử điều này sẽ hoạt động tốt:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);

1
Cảm ơn đã chú ý. Tôi đã chỉnh sửa mã, trên thực tế nó là $ link (biến giữ kết nối)
Sandhu

3

Bạn có thể lấy id được chèn mới nhất bằng hàm php tích hợp sẵn mysql_insert_id();

$id = mysql_insert_id();

bạn cũng nhận được id mới nhất bằng

$id = last_insert_id();

4
Ngoài ra, điều này là sai vì nó đề xuất sử dụng một thư viện không được dùng nữa. Thực sự, hãy xóa cái này
STT LCU

@STTLCU Đoạn mã nào ở đây không được dùng nữa?
TheBlackBenzKid

@TheBlackBenzKid cả, bởi vì họ đang dựa trên mysql_ * chức năng
STT LCU

@Rahul $ id = last_insert_id (); không hoạt động vì có thể nó không được dùng nữa.
Esha

3

Để lấy id được chèn lần cuối trong codeigniter Sau khi thực hiện truy vấn chèn, chỉ cần sử dụng một hàm được gọi insert_id()trên cơ sở dữ liệu, nó sẽ trả về id được chèn cuối cùng

Ví dụ:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

trong một dòng

echo $this->db->insert('mytable',$data)->insert_id();

3

Bạn có thể sử dụng nó mysql_insert_id(), nhưng có một lưu ý cụ thể về việc sử dụng nó, bạn phải gọi nó sau khi thực hiện truy vấn INSERT, nghĩa là trong cùng một phiên tập lệnh. Nếu bạn sử dụng nó nếu không nó sẽ không hoạt động chính xác.


2

Sạch sẽ và đơn giản -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];

1

LƯU Ý: nếu bạn thực hiện nhiều lần chèn với một câu lệnh mysqli :: insert_id sẽ không đúng.

Cái bàn:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

Bây giờ nếu bạn làm:

insert into xyz (name) values('one'),('two'),('three');

Mysqli :: insert_id sẽ là 1 chứ không phải 3.

Để nhận được giá trị chính xác, hãy làm:

mysqli::insert_id + mysqli::affected_rows) - 1

Điều này đã được tài liệu nhưng nó là một chút tối nghĩa.


1

Tôi thích sử dụng cú pháp MySQL thuần túy để lấy id auto_increment cuối cùng của bảng mà tôi muốn.

php mysql_insert_id () và mysql last_insert_id () chỉ cung cấp ID giao dịch cuối cùng.

Nếu bạn muốn có ID auto_incremented cuối cùng của bất kỳ bảng nào trong giản đồ của mình (không chỉ giao dịch cuối cùng), bạn có thể sử dụng truy vấn này

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

Đó là nó.


Tôi nghi ngờ hoàn toàn về điều này, vì SQL này đơn giản là sai trong ngữ cảnh của câu hỏi .... Ngoài ra, phương pháp này có thể dễ xảy ra các điều kiện chạy đua khi hai hoặc nhiều khách hàng thực thi SQL này cùng một lúc ... tôi không chắc dữ liệu cột này được cập nhật nhanh như thế nào sau khi chèn khiến tôi nghi ngờ ... Các chức năng PHP mà có thể lấy id cuối cùng được dựa trên mức độ kết nối / phiên (không nhiều hơn hoặc ít hơn như nhau như MySQL của LAST_INSERT_ID () ) mà làm cho nó tình trạng chủng tộc tiết kiệm
Raymond Nijland

1

Thật buồn khi không thấy bất kỳ câu trả lời nào có ví dụ.

Sử dụng Mysqli :: $ insert_id :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

Sử dụng PDO :: lastInsertId :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID

0

Sử dụng MySQLigiao dịch đôi khi tôi không thể nhận được mysqli::$insert_id, bởi vì nó trả về 0. Đặc biệt nếu tôi đang sử dụng các thủ tục được lưu trữ, việc thực thi INSERTđó s. Vì vậy, có một cách khác trong giao dịch:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>

0

Sử dụng mysqlimysql đang làm suy yếu

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>

0

Tôi đã thử

mysqli_insert_id ($ dbConnectionObj)

Thao tác này trả về id được chèn cuối cùng của kết nối hiện tại, vì vậy nếu bạn đang quản lý các kết nối của mình đúng cách, điều này sẽ hoạt động. Làm việc cho tôi ít nhất.


0

Vui lòng sử dụng PDP và sau đó thử điều này

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();


-1

Bằng tất cả cuộc thảo luận này, tôi giả định rằng lý do để kiểm tra id tối đa là để biết id tiếp theo sẽ là gì .. (nếu id tối đa của tôi là 5 thì tiếp theo sẽ là 5 + 1 = 6).

>> Nếu đây không phải là lý do, tôi thành thật xin lỗi

Trường hợp nếu ai đó CHÈN thông tin giữa CHECK và INSERT của bạn sẽ cung cấp cho bạn ID sai.

Vì vậy, nó có thể được giải quyết nếu bạn tạo băm có thể bao gồm dấu thời gian hoặc giá trị duy nhất khác.

Sau đó, trong cùng một hàm, bạn có thể chèn thông tin của mình với các giá trị trống và hàm băm của bạn. Điều đó sẽ tạo ID nếu bạn đã chọn AUTO_INCRECEMENT.

Sau đó, trong cùng một hàm, bạn vẫn có hàm băm của mình và bạn có thể tìm id có cùng hàm băm. Và sau đó, bạn có thể hoàn thành việc điền các giá trị trống với mysql UPDATE.

Điều này bao gồm nhiều kết nối hơn một chút, nhưng nó vẫn là một cách để làm điều đó ...

Chúc may mắn khi giải quyết nó.


-2

Nếu bảng của bạn có cột TỰ ĐỘNG TĂNG như UserID, Emp_ID, .. thì bạn có thể sử dụng truy vấn này để lấy bản ghi được chèn lần cuối SELECT * FROM table_name nơi UserID = (chọn MAX (UserID) từ table_name) Trong mã PHP:

$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
                                if (!$con) {
                                    die('Could not connect: ' . mysqli_error($con));
                                }
                                $sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
                                $result = mysqli_query($con, $sql);

Sau đó, bạn có thể sử dụng dữ liệu đã tìm nạp theo yêu cầu của mình


Không mã hóa mật khẩu , khi kẻ tấn công lấy được DB thì cũng sẽ lấy được khóa mã hóa.
zaph

-3
mysql_query("INSERT INTO mytable (product) values ('kossu')");

printf("Last inserted record has id %d\n", ***mysql_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.