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', 'KisoDemo'); // 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 [kiso.vn]
Dùng MySQLi Procedural:
// Kết nối $conn = mysqli_connect('localhost', 'root', 'vertrigo', 'KisoDemo'); // 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=KisoDemo", '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 kiso.vn 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 | kiso.vn hoặc gameportable.net |
Bài viết liên quan
[CSF-2] Một số thiết lập CSF, LFD
Hôm nay mình sẽ thực hiện một số thiết lập trên CSF Mở file config để sửa đổi một số tính năng dưới /etc/csf/csf.conf Nội dung chính1. Insert nhiều record vào MySQL bằng PHPDùng MySQLi...
[CSF-1] Tăng bảo mật Server với ConfigServer Firewall (CSF)
Nội dung chính1. Insert nhiều record vào MySQL bằng PHPDùng MySQLi Object-oriented:Dùng MySQLi Procedural:Dùng PDO:2. Lời kết1. Khái niệm CSF: CSF (ConfigServer & Firewall) là một bộ ứng dụng hoạt động trên Linux như một firewall...
Sử dụng SSH Key với Gitlab và Github
Bài viết này mình sẽ hướng dẫn các bạn tạo ssh key cho Gitlab và Github SSH là gì? Secure Socket Shell là một giao thức mạng dùng để thiết lập kết nối mạng một...
Directory traversal vulnerabilities (phần 4)
Nội dung chính1. Insert nhiều record vào MySQL bằng PHPDùng MySQLi Object-oriented:Dùng MySQLi Procedural:Dùng PDO:2. Lời kếtV. Phân tích và khai thác các lỗ hổng Directory traversal (tiếp) 5. Bypass lỗ hổng khi trang web sử...
Directory traversal vulnerabilities (phần 3)
Nội dung chính1. Insert nhiều record vào MySQL bằng PHPDùng MySQLi Object-oriented:Dùng MySQLi Procedural:Dùng PDO:2. Lời kếtV. Phân tích và khai thác các lỗ hổng Directory traversal 1. Lỗ hổng xảy ra khi sử dụng các...
Directory traversal vulnerabilities (phần 2)
Nội dung chính1. Insert nhiều record vào MySQL bằng PHPDùng MySQLi Object-oriented:Dùng MySQLi Procedural:Dùng PDO:2. Lời kếtIII. Vì sao lỗ hổng Directory traversal xuất hiện? Với mỗi ngôn ngữ lập trình khác nhau, điểm xuất hiện...