1. Tại sao phải lấy ID vừa insert?

Trong các ứng dụng CSDL thực tế tồn tại mối quan hệ khóa chính(PRIMARY KEY) và khóa ngoại(FOREIGN KEY). Thông thường khi thiết kế CSDL cho các hệ thống website thì khóa chính ta hay sử dụng tăng tự động (auto_increment), vì vậy lúc thêm dữ liệu ta không cần phải giá trị ID khóa chính. Như vậy ta không thể biết được khóa chính của record vừa insert là bao nhiêu? Và tuy nhiên, cũng có một số tình huống bạn cần lấy ID được tạo tự động đó để chèn nó vào bảng thứ hai.

Trong các mô hình CSDL có mối quan hệ khóa ngoại nên lúc Insert đôi lúc ta cần lấy giá trị khóa chính của field vừa insert để các table con sử dụng làm khóa ngoại. Lúc này ta phải sử dụng các hàm có sẵn trong PHP để giải quyết. Mỗi thư viện database trong PHP cũng đều cung cấp những hàm và phương thức giúp lấy ID vừa insert (tức là id cuối cùng). Đối với thư viện MySQLi thì ta có hàm mysqli_insert_id() và thuộc tính insert_id. Còn đối với PDO thì ta có phương thức lastInsertId().

2. Sử dụng MySQLi hướng thủ tục

<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (người dùng 'root' không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "db_lttd");
// Kiểm tra kết nối
if($link === false){
    die("ERROR: Không thể kết nối. " . mysqli_connect_error());
} 
// Cố gắng thực hiện câu lệnh INSERT
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Thành', 'Nguyễn', 'thanh@mail.com')";
if(mysqli_query($link, $sql)){
    // Lấy ID đã chèn cuối cùng
    $last_id = mysqli_insert_id($link);
    echo "Chèn bản ghi thành công. ID đã chèn cuối cùng là: " . $last_id;
} else{
    echo "ERROR: Không thể thực thi câu lệnh $sql. " . mysqli_error($link);
}
// Đóng kết nối
mysqli_close($link);
?>

3. Sử dụng MySQLi hướng đối tượng

<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (người dùng 'root' không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "db_lttd"); 
// Kiểm tra kết nối
if($mysqli === false){
    die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
} 
// Cố gắng thực hiện câu lệnh INSERT
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Thành', 'Nguyễn', 'thanh@mail.com')";
if($mysqli->query($sql) === true){
    // Lấy ID đã chèn cuối cùng
    $last_id = $mysqli->insert_id;
    echo "Chèn bản ghi thành công. ID đã chèn cuối cùng là: " . $last_id;
} else{
    echo "ERROR: Không thể thực thi câu lệnh $sql. " . $mysqli->error;
} 
// Đóng kết nối
$mysqli->close();
?>

4. Sử dụng PDO

<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (người dùng 'root' không có mật khẩu) */
try{
    $pdo = new PDO("mysql:host=localhost;dbname=db_lttd", "root", "");
    // Thiết lập chế độ PDO error thành ngoại lệ
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực hiện câu lệnh INSERT
try{
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Thành', 'Nguyễn', 'thanh@mail.com')";    
    $pdo->exec($sql);
    $last_id = $pdo->lastInsertId();
    echo "Chèn bản ghi thành công. ID đã chèn cuối cùng là: " . $last_id;
} catch(PDOException $e){
    die("ERROR: Không thể thực thi câu lệnh $sql. " . $e->getMessage());
} 
// Đóng kết nối
unset($pdo);
?>