Bài 05: Lấy ID vừa insert bằng PHP

PHP & MySQL 17/03/2017 07:00 1404
Khi thiết kế CSDL cho các hệ thống thì khóa chính ta thường sử dụng tăng tự động (AUTO_INCREMENT), lúc thêm dữ liệu ta không cần phải truyền giá trị cho trường này. Chính vì điều đó ta không thể biết được khóa chính của record vừa insert là bao nhiêu? Trong MySQL có một câu truy vấn giúp lấy ID vừa insert đó là hàm LAST_INSERT_ID()

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) khi bạn sử dụng câu lệnh Insert bạn cần lấy được giá trị ID của bảng cha làm khóa ngoại của các bảng con.

Ví dụ: Trong database CSDL mẫu ta có hai bảng ordersorderdetails

 

Như các bạn đã biết một đơn hàng thì sẽ có một hay nhiều sản phầm. Bảng orders lưu trữ thông tin của đơn hàng và bảng orderdetails lưu trữ thông tin của sản phẩm trong đơn hàng đó và chúng được ràng buộc với nhau bởi orderNumber là khóa chính và khóa ngoại.

Khi bạn muốn lấy thông tin của đơn hàng thì bắt buộc bạn phải lấy được orderNumber từ đó bạn mới lấy được chi tiết sản phầm nào đã được mua trong đơn hàng đó.

Trong MySQL làm sao ta có thể lấy được ID vừa mới chèn vào CSDL của một table. Nói chung thì các hệ quản trị CSDL nào cũng cung cấp cho chúng ta hàm để thực hiện việc này. Đố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()

Chúng ta sẽ có 3 trường hợp như sau:

Trường hợp MySQLi Object-oriented

$host = "localhost";
$username = "username";
$password = "";
$dbName = "MySQLDemo";

// Tạo kết nối
$dbconn = new mysqli($host, $username, $password, $dbName);

// Kiểm tra kết nối
if ($dbconn->connect_error) {
	die("Kết nối thất bại: " . $dbconn->connect_error);
} 

// Câu SQL Insert
$sql = "INSERT INTO News (title, slug, intro)
VALUES ('Học PHP & MySQL', 'hoc-php-mysql', 'Mô tả ngắn về học PHP & MySQL')";

// Thực hiện thêm record
if ($dbconn->query($sql) === TRUE) {
	$last_id = $dbconn->insert_id;
	echo "Thêm mới thành công có ID là: " . $last_id;
} else {
	echo "Lỗi: " . $sql . "<br>" . $dbconn->error;
}

// Ngắt kết nối
$dbconn->close();

Trường hợp MySQLi Procedural

$host = "localhost";
$username = "username";
$password = "";
$dbName = "MySQLDemo";

// Tạo kết nối
$dbconn = mysqli_connect($host, $username, $password, $dbName);

// Kiểm tra kết nối
if (!$dbconn) {
	die("Kết nối thất bại: " . mysqli_connect_error());
} 

// Câu SQL Insert
$sql = "INSERT INTO News (title, slug, intro)
VALUES ('Học PHP & MySQL', 'hoc-php-mysql', 'Mô tả ngắn về học PHP & MySQL')";

// Thực hiện thêm record
if (mysqli_query($sql) === TRUE) {
	$last_id = mysqli_insert_id($dbconn);
	echo "Thêm mới thành công có ID là: " . $last_id;
} else {
	echo "Lỗi: " . $sql . "<br>" . mysqli_error($dbconn);
}

// Ngắt kết nối
mysqli_close();

Trường hợp PDO

 

$host = "localhost";
$username = "username";
$password = "";
$dbName = "MySQLDemo";

try {
    // Tạo kết nối
    $dbconn = new PDO("mysql:host=$host;dbname=$dbName", $username, $password);
      
    // Cấu hình exception
    $dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      
   // Câu SQL Insert
	$sql = "INSERT INTO News (title, slug, intro)
	VALUES ('Học PHP & MySQL', 'hoc-php-mysql', 'Mô tả ngắn về học PHP & MySQL')";
  
    // Thực hiện thêm record
    $dbconn->exec($sql);
     
    $last_id = $dbconn->lastInsertId();
    echo "Thêm mới thành công có ID là: " . $last_id;
} 
catch (PDOException $e) {
    echo $e->getMessage();
}
  
// Ngắt kết nối
$dbconn = null;

 

Tổng kết.

Như vậy mình đã trình bày xong làm sao có thể lấy được LAST_INSERT_ID trong MySQL sử dụng PHP. Hy vọng bài viết có ích cho các bạn.

Xem Thêm

Profile photo of adminTheHalfHeart

B.V.T

Sinh ra và lớn nên ở Bắc Giang. Hiện tại thì tôi đang là một lập trình viên tại VietISO. Tôi lập website này với mục đích là bookmark những gì tôi đã đọc qua và mong muốn chia sẻ những gì tôi biết.