Khi làm việc với cơ sở dữ liệu MySQL trong PHP, có những lúc bạn cần chèn nhiều bản ghi (records) vào một bảng chỉ trong một truy vấn duy nhất. Việc chèn nhiều bản ghi bằng một câu lệnh SQL không chỉ giúp tăng hiệu suất mà còn giảm thiểu thời gian kết nối với cơ sở dữ liệu.
Trong bài viết này, chúng ta sẽ học cách chèn nhiều bản ghi vào bảng MySQL bằng PHP, sử dụng cả hai phương pháp mysqli và PDO.
1. Chèn nhiều bản ghi vào MySQL bằng mysqli
a) Sử dụng hướng đối tượng (OOP)
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);
// 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 để chèn nhiều bản ghi
$sql = "INSERT INTO Users (username, email) VALUES
('john_doe', 'john@example.com'),
('jane_doe', 'jane@example.com'),
('alice', 'alice@example.com'),
('bob', 'bob@example.com')";
if ($conn->query($sql) === TRUE) {
echo "Nhiều bản ghi đã được chèn thành công!";
} else {
echo "Lỗi khi chèn bản ghi: " . $conn->error;
}
// Đóng kết nối
$conn->close();
?>Giải thích:
INSERT INTO: Chỉ định bảngUsersmà các bản ghi sẽ được chèn vào.- Mỗi cặp giá trị được bao trong dấu ngoặc đơn
(username, email)và các bản ghi được phân cách bằng dấu phẩy. - Nếu câu lệnh chèn thành công, PHP sẽ thông báo "Nhiều bản ghi đã được chèn thành công!".
b) Sử dụng hướng thủ tục
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 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 để chèn nhiều bản ghi
$sql = "INSERT INTO Users (username, email) VALUES
('john_doe', 'john@example.com'),
('jane_doe', 'jane@example.com'),
('alice', 'alice@example.com'),
('bob', 'bob@example.com')";
if (mysqli_query($conn, $sql)) {
echo "Nhiều bản ghi đã được chèn thành công!";
} else {
echo "Lỗi khi chèn bản ghi: " . mysqli_error($conn);
}
// Đóng kết nối
mysqli_close($conn);
?>Giải thích:
- Cách tiếp cận hướng thủ tục tương tự như hướng đối tượng, nhưng chúng ta sử dụng các hàm thủ tục như
mysqli_connect()vàmysqli_query()để kết nối và thực hiện truy vấn.
2. Chèn nhiều bản ghi vào MySQL bằng PDO
Sử dụng PDO để chèn nhiều bản ghi vào cơ sở dữ liệu MySQL rất linh hoạt và mạnh mẽ, đặc biệt là với khả năng xử lý lỗi bằng cách sử dụng ngoại lệ (exceptions).
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
try {
// Tạo kết nối PDO
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// Cài đặt chế độ lỗi PDO thành Exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Câu lệnh SQL để chèn nhiều bản ghi
$sql = "INSERT INTO Users (username, email) VALUES
('john_doe', 'john@example.com'),
('jane_doe', 'jane@example.com'),
('alice', 'alice@example.com'),
('bob', 'bob@example.com')";
// Thực hiện câu lệnh
$conn->exec($sql);
echo "Nhiều bản ghi đã được chèn thành công!";
} catch(PDOException $e) {
echo "Lỗi khi chèn bản ghi: " . $e->getMessage();
}
// Đóng kết nối
$conn = null;
?>Giải thích:
- PDO::exec() được sử dụng để thực hiện truy vấn SQL không trả về kết quả (như
INSERT,UPDATE, hoặcDELETE). - Khối
try-catchxử lý các lỗi có thể xảy ra trong quá trình chèn dữ liệu, và thông báo lỗi sẽ được hiển thị nếu có vấn đề xảy ra.
3. Sử dụng Prepared Statements cho nhiều bản ghi
Khi bạn muốn bảo mật và ngăn ngừa SQL Injection, bạn có thể sử dụng Prepared Statements với mysqli hoặc PDO. Tuy nhiên, với nhiều bản ghi, bạn phải thực hiện câu lệnh INSERT nhiều lần.
a) Sử dụng Prepared Statements với mysqli
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
// Chuẩn bị câu lệnh
$stmt = $conn->prepare("INSERT INTO Users (username, email) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $email);
// Dữ liệu nhiều bản ghi
$users = [
['username' => 'charlie', 'email' => 'charlie@example.com'],
['username' => 'dave', 'email' => 'dave@example.com'],
['username' => 'eve', 'email' => 'eve@example.com'],
];
// Thực hiện chèn nhiều bản ghi
foreach ($users as $user) {
$username = $user['username'];
$email = $user['email'];
$stmt->execute();
}
echo "Nhiều bản ghi đã được chèn thành công!";
// Đóng kết nối
$stmt->close();
$conn->close();
?>b) Sử dụng Prepared Statements với PDO
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
try {
// Tạo kết nối PDO
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Chuẩn bị câu lệnh SQL
$stmt = $conn->prepare("INSERT INTO Users (username, email) VALUES (:username, :email)");
// Dữ liệu nhiều bản ghi
$users = [
['username' => 'charlie', 'email' => 'charlie@example.com'],
['username' => 'dave', 'email' => 'dave@example.com'],
['username' => 'eve', 'email' => 'eve@example.com'],
];
// Thực hiện chèn nhiều bản ghi
foreach ($users as $user) {
$stmt->bindParam(':username', $user['username']);
$stmt->bindParam(':email', $user['email']);
$stmt->execute();
}
echo "Nhiều bản ghi đã được chèn thành công!";
} catch(PDOException $e) {
echo "Lỗi khi chèn bản ghi: " . $e->getMessage();
}
// Đóng kết nối
$conn = null;
?>Giải thích:
- Prepared Statements bảo vệ ứng dụng khỏi các cuộc tấn công SQL Injection bằng cách tách biệt câu lệnh SQL và dữ liệu người dùng.
- Dữ liệu của từng người dùng được chèn vào thông qua vòng lặp
foreach, với mỗi bản ghi được chèn vào bảngUsersmột cách an toàn.
4. Kết luận
Việc chèn nhiều bản ghi vào bảng MySQL trong PHP có thể được thực hiện bằng nhiều cách khác nhau:
mysqlivàPDOđều hỗ trợ chèn nhiều bản ghi chỉ với một câu lệnh SQL.- Sử dụng Prepared Statements nếu bạn muốn bảo vệ ứng dụng của mình khỏi SQL Injection, nhưng nếu bạn cần chèn nhiều bản ghi, bạn sẽ phải chạy nhiều truy vấn trong vòng lặp.
Sử dụng cách tiếp cận phù hợp tùy thuộc vào nhu cầu và bối cảnh ứng dụng của bạn. Chèn nhiều bản ghi một lần giúp tiết kiệm tài nguyên và thời gian, đặc biệt khi làm việc với lượng dữ liệu lớn.








