Bài 07: Insert nhiều record vào MySQL bằng PHP

Lúc học MySQL ta có thể chạy nhiều câu truy vấn cùng lúc bằng cách viết trong PHPMYADMIN hoặc một editor nào đó như SQLYog. Phần mềm thì mình không bàn tới nhưng với PHPMYADMIN thực chất nó cũng là một ứng dụng web nên nó chạy multi query được thì mình cũng có thể làm được.

1. Insert nhiều record vào MySQL bằng PHP

Trong thư viện MySQLi hỗ trợ hai hàm dùng để thực hiện nhiều câu lệnh truy vấn đó là hàm mysqli_multi_query() đối với trường hợp dùng Procedural và phương thức multi_query() đối với trường hợp dùng Object-oriented.

Riêng đối với PDO thì ta phải thực hiện khác chút xíu đó là phải hợp transaction và mỗi lần mỗi câu truy vấn chứ không phải là chạy cùng lúc.

Dùng MySQLi Object-oriented:

// Kết nối
$conn = new mysqli('localhost', 'root', 'vertrigo', 'FreetutsDemo');

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

// Câu lệnh SQL
$sql = "INSERT INTO News (title, content) 
        VALUES ('tieu de 1', 'noi dung 1');";
$sql .= "INSERT INTO News (title, content) 
        VALUES ('tieu de 2', 'noi dung 2');";

// Thực thi câu lệnh
if ($conn->multi_query($sql) === TRUE) {
    echo "Thêm thành công";
} else {
    echo "Lỗi: " . $sql . "<br>" . $conn->error;
}

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

Bạn lưu ý là vì chúng ta đang thực hiện nhiều câu SQL trong cùng một tài liệu neen cuối mỗi lệnh SQL phải có dấu chấm phẩy nhé ;.

Dùng MySQLi Procedural:

// Kết nối
$conn = mysqli_connect('localhost', 'root', 'vertrigo', 'FreetutsDemo');

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

// Câu lệnh SQL
$sql = "INSERT INTO News (title, content) 
        VALUES ('tieu de 1', 'noi dung 1');";
$sql .= "INSERT INTO News (title, content) 
        VALUES ('tieu de 2', 'noi dung 2');";

// Thực thi câu lệnh
if (mysqli_multi_query($conn, $sql)) {
    echo "Thêm thành công";
} else {
    echo "Lỗi: " . $sql . "<br>" . mysqli_error($conn);
}

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

Tương tự như phần lưu ý trên, cuối mỗi câu SQL bạn phải có dấu chấm phẩy.

Dùng PDO:

Khi chúng ta insert nhiều câu truy vấn cùng lúc thì thường bị lỗi có một câu truy vấn nào đó sai cú pháp hoặc bị lỗi thì nó sẽ dừng lại toàn bộ, lúc này những câu SQL đã xử lý sẽ không thể phục hồi được. Ví dụ khi bạn viết chứ năng rút tiền trong thẻ ATM, người dùng đưa thẻ vào và rút tiền, máy ATM sẽ kiêm tra là còn tiền không? Nếu còn thì cập nhật trạng thái là đã rút tiền và trả tiền cho người dùng. Nhưng giả sử mới kiểm tra và câp nhật trạng thái là đã rút tiền nhưng chưa trả tiền thì hệ thống bị lỗi, người dùng chưa nhận được tiền nên sẽ dẫn đến không đồng bộ. Những trường hợp thế này rất là nguy hiểm nên các hệ quản trị CSDL đưa ra khái niệm transaction, với transaction thì chỉ cần một thao tác bị lỗi là lập tức nó sẽ rollback lại toàn bộ trạng thái ban đầu.

try {
    // Kết nối
    $conn = new PDO("mysql:host=localhost;dbname=FreetutsDemo", 'root', 'vertrigo');
    // Thiết lập exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Bắt đầu transaction
    $conn->beginTransaction();
    
    // Thực thi từng câu truy vấn
    $conn->exec("INSERT INTO News (title, content) 
        VALUES ('tieu de 1', 'noi dung 1')");
    $conn->exec("INSERT INTO News (title, content) 
        VALUES ('tieu de 2', 'noi dung 2')");

    // Nếu mọi thứ thành công thì commit
    $conn->commit();
    
    echo "Thao tác thành công";
} 
catch (PDOException $e) {
    // Nếu xuất hiện lỗi thì rollback lại các thao tác
    $conn->rollback();
    echo "Lỗi: " . $e->getMessage();
}


// Ngắt kết nối
$conn = null;

2. Lời kết

Trong bài này mình có nói sơ lược về transaction nên nếu bạn chưa biết về transaction thì sẽ hơi khó. Hiện tại trên freetuts.net chưa có tutorials về transaction, vì vậy sau này mình sẽ viết về vấn đề này để các bạn nắm rõ hơn. Bài tiếp theo chúng ta sẽ tìm hiểu cơ chế prepared của hai thư viện MySQLi và PDO.

Hãy để lại link bài viết gốc khi chia sẻ bài viết này, mình sẽ report DMCA với những website lấy nội dung mà không để nguồn hoặc copy bài với số lượng lớn.

Nguồn: freetuts.net

Profile photo of adminTheHalfHeart

TheHalfHeart

Có sở thích viết tuts nên đã từng tham gia viết ở một số diễn đàn, đến năm 2014 mới có điều kiện sáng lập ra freetuts.net. Sinh năm 90 và có 1 vợ 2 con, thích ca hát và lập trình.

ĐĂNG BÌNH LUẬN: Đăng câu hỏi trên Group Facebook để được hỗ trợ nhanh nhất.