Trong PHP, để cập nhật dữ liệu trong cơ sở dữ liệu MySQL, bạn có thể sử dụng câu lệnh SQL UPDATE. Mệnh đề UPDATE cho phép bạn thay đổi dữ liệu của một hoặc nhiều bản ghi trong bảng dựa trên điều kiện cụ thể. PHP hỗ trợ hai cách phổ biến để thực hiện truy vấn này: sử dụng mysqli và PDO.
Bài viết này sẽ hướng dẫn bạn cách cập nhật dữ liệu trong MySQL bằng PHP với cả hai phương pháp.
1. Cú pháp của câu lệnh UPDATE
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;table_name: Tên bảng mà bạn muốn cập nhật dữ liệu.SET: Định nghĩa các cột và giá trị mới mà bạn muốn thay đổi.WHERE condition: Điều kiện để chỉ định bản ghi nào sẽ được cập nhật. Lưu ý: Nếu bạn không sử dụng mệnh đềWHERE, tất cả các bản ghi trong bảng sẽ được cập nhật.
2. Sử dụng mysqli để cập nhật dữ liệu
a) Hướng đối tượng (OOP)
Dưới đây là cách sử dụng mysqli theo mô hình hướng đối tượng để cập nhật dữ liệu từ bảng MySQL.
<?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 để cập nhật dữ liệu
$sql = "UPDATE Users SET email='newemail@example.com' WHERE id=1";
if ($conn->query($sql) === TRUE) {
echo "Cập nhật bản ghi thành công!";
} else {
echo "Lỗi khi cập nhật bản ghi: " . $conn->error;
}
// Đóng kết nối
$conn->close();
?>Giải thích:
UPDATE Users SET email='newemail@example.com' WHERE id=1: Câu lệnh này sẽ cập nhật email của bản ghi cóid=1trong bảngUsers.$conn->query($sql): Thực hiện câu lệnh SQL. Nếu thành công, nó sẽ hiển thị thông báo cập nhật thành công, nếu không, sẽ hiển thị lỗi.
b) Hướng thủ tục
Cách tiếp cận theo hướng thủ tục cũng tương tự như hướng đối tượng, nhưng sử dụng các hàm thủ tục như mysqli_query().
<?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 để cập nhật dữ liệu
$sql = "UPDATE Users SET email='newemail@example.com' WHERE id=1";
if (mysqli_query($conn, $sql)) {
echo "Cập nhật bản ghi thành công!";
} else {
echo "Lỗi khi cập nhật bản ghi: " . mysqli_error($conn);
}
// Đóng kết nối
mysqli_close($conn);
?>Giải thích:
mysqli_query($conn, $sql): Thực hiện câu lệnh SQLUPDATE. Nếu cập nhật thành công, nó sẽ hiển thị thông báo thành công.
3. Sử dụng PDO để cập nhật dữ liệu
PDO là một class trong PHP cung cấp giao diện hướng đối tượng để làm việc với nhiều loại cơ sở dữ liệu, bao gồm MySQL.
<?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);
// Câu lệnh SQL để cập nhật dữ liệu
$sql = "UPDATE Users SET email='newemail@example.com' WHERE id=1";
// Thực hiện câu lệnh
$stmt = $conn->prepare($sql);
$stmt->execute();
echo $stmt->rowCount() . " bản ghi đã được cập nhật thành công!";
} catch(PDOException $e) {
echo "Lỗi khi cập nhật bản ghi: " . $e->getMessage();
}
// Đóng kết nối
$conn = null;
?>Giải thích:
prepare(): Chuẩn bị câu lệnh SQL trước khi thực hiện.execute(): Thực hiện câu lệnh SQL.rowCount(): Trả về số bản ghi đã được cập nhật. Thông báo này sẽ hiển thị số lượng bản ghi bị ảnh hưởng bởi truy vấnUPDATE.
4. Sử dụng Prepared Statements để cập nhật dữ liệu
Sử dụng Prepared Statements giúp bảo vệ ứng dụng của bạn khỏi các cuộc tấn công SQL Injection khi bạn thao tác với dữ liệu đầu vào từ người dùng.
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 SQL
$stmt = $conn->prepare("UPDATE Users SET email=? WHERE id=?");
$stmt->bind_param("si", $email, $id);
// Gán giá trị và thực thi câu lệnh
$email = "updatedemail@example.com";
$id = 1;
$stmt->execute();
echo "Bản ghi đã được cập nhật thành công!";
// Đóng câu lệnh và kết nối
$stmt->close();
$conn->close();
?>Giải thích:
prepare(): Chuẩn bị câu lệnh SQL với các tham số placeholder (?).bind_param(): Liên kết biến PHP với các tham số SQL. Ở đây,sibiểu thị rằng tham số đầu tiên là chuỗi (s) và tham số thứ hai là số nguyên (i).execute(): Thực thi câu lệnh với các giá trị đã liên kết.
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("UPDATE Users SET email=:email WHERE id=:id");
// Liên kết tham số và thực thi câu lệnh
$email = "updatedemail@example.com";
$id = 1;
$stmt->bindParam(':email', $email);
$stmt->bindParam(':id', $id);
$stmt->execute();
echo $stmt->rowCount() . " bản ghi đã được cập nhật thành công!";
} catch(PDOException $e) {
echo "Lỗi khi cập nhật bản ghi: " . $e->getMessage();
}
// Đóng kết nối
$conn = null;
?>Giải thích:
bindParam(): Liên kết biến với các tham số trong câu lệnh SQL (:email,:id).- Prepared Statements giúp bảo vệ dữ liệu đầu vào khỏi các cuộc tấn công SQL Injection.
5. Cập nhật nhiều bản ghi
Nếu bạn muốn cập nhật nhiều bản ghi cùng một lúc, bạn có thể sử dụng các điều kiện trong mệnh đề WHERE như IN hoặc AND, OR.
Ví dụ:
$sql = "UPDATE Users SET email='newemail@example.com' WHERE id IN (1, 2, 3)";Câu lệnh trên sẽ cập nhật email của các bản ghi có id là 1, 2, hoặc 3.
6. Xử lý lỗi khi cập nhật dữ liệu
Khi thực hiện các truy vấn cập nhật dữ liệu, bạn nên xử lý các lỗi có thể xảy ra như lỗi kết nối, lỗi cú pháp SQL hoặc lỗi về ràng buộc dữ liệu. Sử dụng khối try-catch với PDO và kiểm tra $conn->error với mysqli sẽ giúp ứng dụng của bạn ổn định hơn.
Ví dụ với mysqli:
if ($conn->query($sql) === FALSE) {
echo "Lỗi khi cập nhật bản ghi: " . $conn->error;
}Ví dụ với PDO:
try {
$stmt->execute();
} catch(PDOException $e) {
echo "Lỗi: " . $e->getMessage();
}7. Kết luận
Câu lệnh UPDATE trong MySQL cho phép bạn thay đổi dữ liệu đã lưu trữ trong bảng một cách linh hoạt và hiệu quả. PHP cung cấp các phương pháp thông qua mysqli và PDO để thực hiện các truy vấn này.
mysqli: Hỗ trợ cả hai mô hình hướng đối tượng và hướng thủ tục.- PDO: Mang lại sự linh hoạt và an toàn cao khi làm việc với cơ sở dữ liệu, đồng thời hỗ trợ nhiều hệ quản trị cơ sở dữ liệu khác ngoài MySQL.
Sử dụng Prepared Statements là một cách hiệu quả để bảo vệ dữ liệu khỏi SQL Injection và giúp quá trình xử lý dữ liệu an toàn hơn.









