PHP - Mở rộng PDO: Hướng dẫn cho người mới bắt đầu

Xin chào các bạn nhà lập trình đang học hỏi! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của PHP và mở rộng mạnh mẽ của nó - PDO. Đừng lo lắng nếu bạn chưa từng viết một dòng mã trước đây - tôi sẽ là người hướng dẫn thân thiện của bạn, giải thích từng bước một. Nào, hãy cầm một tách cà phê và cùng nhau bắt đầu!

PHP - PDO Extension

PDO là gì?

PDO viết tắt của PHP Data Objects. Nó giống như một bộ dịch viên UNIVERSAL giúp PHP giao tiếp với các loại cơ sở dữ liệu khác nhau. Hãy tưởng tượng bạn đang cố gắng giao tiếp với người từ các quốc gia khác nhau - PDO là bạn đa ngôn ngữ của bạn có thể nói với tất cả họ!

Tại sao nên sử dụng PDO?

Bạn có thể tự hỏi, "Tại sao tôi nên quan tâm đến PDO?" Hãy để tôi kể cho bạn một câu chuyện ngắn. Khi tôi mới bắt đầu dạy PHP, chúng tôi sử dụng các phương pháp khác nhau cho từng loại cơ sở dữ liệu. Nó giống như học một ngôn ngữ mới mỗi lần bạn thay đổi cơ sở dữ liệu. PDO đã thay đổi tất cả điều đó. Nó cung cấp một cách tiếp cận nhất quán để làm việc với cơ sở dữ liệu, giúp cuộc sống của bạn như một nhà phát triển trở nên dễ dàng hơn.

Bây giờ, hãy cùng làm quen với một chút mã!

Kết nối PDO

Thiết lập kết nối

Để bắt đầu sử dụng PDO, trước tiên chúng ta cần kết nối với cơ sở dữ liệu. Đây là cách chúng ta làm:

<?php
$host = 'localhost';
$dbname = 'my_database';
$username = 'root';
$password = 'password';

try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Kết nối thành công";
} catch(PDOException $e) {
echo "Kết nối thất bại: " . $e->getMessage();
}
?>

Hãy phân tích này:

  1. Chúng ta xác định chi tiết kết nối (máy chủ, tên cơ sở dữ liệu, tên người dùng và mật khẩu).
  2. Chúng ta sử dụng khối try-catch để xử lý bất kỳ lỗi tiềm ẩn nào.
  3. Trong khối try, chúng ta tạo một đối tượng PDO với chi tiết kết nối của chúng ta.
  4. Chúng ta đặt chế độ lỗi để ném ngoại lệ, giúp chúng ta bắt và xử lý lỗi tốt hơn.
  5. Nếu mọi thứ đều tốt, chúng ta sẽ thấy "Kết nối thành công". Nếu không, chúng ta sẽ thấy một thông báo lỗi.

Tùy chọn kết nối

PDO cho phép chúng ta đặt các tùy chọn khác nhau khi kết nối. Dưới đây là một ví dụ:

<?php
$options = [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];

$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password, $options);
?>

Những tùy chọn này đặt chế độ fetch mặc định là mảng liên kết và vô hiệu hóa các câu lệnh prepared emulated. Đừng lo lắng nếu điều này听起来 như tiếng lóng - chúng ta sẽ khám phá các khái niệm này sâu hơn khi chúng ta tiếp tục!

Phương thức lớp PDO

Bây giờ chúng ta đã kết nối, hãy xem xét một số phương thức PDO phổ biến mà bạn sẽ sử dụng.

Thực thi truy vấn

Phương thức query()

Phương thức query() được sử dụng để thực thi các truy vấn SQL đơn giản:

<?php
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch()) {
echo $row['name'] . "\n";
}
?>

Mã này lấy tất cả người dùng từ bảng 'users' và in tên của họ. Nó giống như yêu cầu PDO đi đến thư viện (cơ sở dữ liệu), tìm cuốn sách của người dùng và đọc tên của họ cho bạn.

Phương thức exec()

Phương thức exec() được sử dụng cho các câu lệnh SQL không trả về kết quả:

<?php
$count = $pdo->exec("DELETE FROM users WHERE active = 0");
echo "$count người dùng không hoạt động đã bị xóa.";
?>

Mã này xóa người dùng không hoạt động và thông báo cho bạn biết số lượng người dùng đã bị xóa. Hãy tưởng tượng bạn đang yêu cầu PDO làm sạch danh sách người dùng của bạn bằng cách loại bỏ bất kỳ ai không hoạt động.

Câu lệnh Prepared

Câu lệnh Prepared là một cách an toàn hơn để thực thi các truy vấn, đặc biệt khi làm việc với dữ liệu người dùng. Chúng giúp ngăn chặn các cuộc tấn công SQL injection - một lỗ hổng an ninh phổ biến.

<?php
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => 'John Doe', 'email' => '[email protected]']);
?>

Điều này giống như cho PDO một mẫu để điền. Chúng ta chuẩn bị câu lệnh trước, sau đó điền vào các khoảng trống (:name:email) với các giá trị thực tế.

Lấy kết quả

PDO cung cấp nhiều cách để lấy kết quả:

<?php
$stmt = $pdo->query("SELECT * FROM users");

// Lấy dưới dạng mảng liên kết
$user = $stmt->fetch(PDO::FETCH_ASSOC);

// Lấy dưới dạng đối tượng
$user = $stmt->fetch(PDO::FETCH_OBJ);

// Lấy tất cả kết quả
$users = $stmt->fetchAll();
?>

Hãy tưởng tượng những cách này là các cách khác nhau để đóng gói dữ liệu mà PDO thu thập cho bạn. Bạn có thể nhận nó dưới dạng một danh sách (mảng), một gói có cấu trúc (đối tượng) hoặc tất cả một lần.

Quản lý giao dịch

Giao dịch cho phép bạn thực hiện nhiều thao tác như một đơn vị công việc duy nhất:

<?php
try {
$pdo->beginTransaction();
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
echo "Thất bại: " . $e->getMessage();
}
?>

Điều này giống như nói với PDO, "Tôi sắp làm điều quan trọng, hãy đảm bảo rằng tất cả các thao tác này xảy ra hoặc không xảy ra nào." Điều này rất tốt cho các thao tác mà bạn cần đảm bảo tính toàn vẹn dữ liệu.

Bảng phương thức PDO

Dưới đây là bảng tóm tắt các phương thức PDO chính mà chúng ta đã thảo luận:

Phương thức Mô tả Ví dụ
query() Thực thi một truy vấn SQL $stmt = $pdo->query("SELECT * FROM users");
exec() Thực thi một câu lệnh SQL và trả về số lượng hàng bị ảnh hưởng $count = $pdo->exec("DELETE FROM users WHERE active = 0");
prepare() Chuẩn bị một câu lệnh để thực thi $stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
execute() Thực thi một câu lệnh đã chuẩn bị $stmt->execute(['name' => 'John', 'email' => '[email protected]']);
fetch() Lấy hàng tiếp theo từ một tập kết quả $row = $stmt->fetch(PDO::FETCH_ASSOC);
fetchAll() Lấy tất cả các hàng từ một tập kết quả $rows = $stmt->fetchAll();
beginTransaction() Khởi động một giao dịch $pdo->beginTransaction();
commit() Chấp nhận một giao dịch $pdo->commit();
rollBack() Thôi bỏ một giao dịch $pdo->rollBack();

Và thế là xong! Chúng ta đã bao gồm các khái niệm cơ bản của phần mở rộng PDO của PHP. Nhớ rằng, giống như học bất kỳ kỹ năng mới nào, việc thành thạo PDO đòi hỏi phải thực hành. Đừng nản lòng nếu mọi thứ không có vẻ rõ ràng ngay từ đầu. Hãy tiếp tục thử nghiệm, và sớm bạn sẽ thành thạo việc truy vấn cơ sở dữ liệu như một chuyên gia!

Chúc các bạn may mắn, các pháp sư cơ sở dữ liệu tương lai!

Credits: Image by storyset