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é ;
.
Bài viết này được đăng tại [free tuts .net]
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.
Danh sách file tải về
Tên file tải về | Pass giải nén |
---|---|
Tải bài học định dạng PDF | freetuts.net hoặc gameportable.net |