0

PHP và MySQL Bài 23: Giới thiệu về PDO (PHP Data Objects) - Kỷ nguyên mới của kết nối Cơ sở dữ liệu

Trước đây, khi học PHP, các giáo trình cũ thường hướng dẫn kết nối với cơ sở dữ liệu bằng các hàm bắt đầu bằng mysql_ (như mysql_connect). Tuy nhiên, bộ hàm này đã bị "khai tử" (deprecated) từ rất lâu vì các lỗ hổng bảo mật nghiêm trọng.

Hiện nay, cộng đồng lập trình viên PHP chuyên nghiệp chỉ sử dụng hai giải pháp: MySQLi (MySQL Improved)PDO (PHP Data Objects). Trong series này, chúng ta sẽ chọn PDO làm tiêu chuẩn. Bài học này sẽ giải thích lý do tại sao.


1. PDO (PHP Data Objects) là gì?

PDO là một lớp (Class) được tích hợp sẵn trong PHP, đóng vai trò như một "phiên dịch viên" trung gian giữa mã nguồn PHP và cơ sở dữ liệu.

Thay vì phải giao tiếp trực tiếp với MySQL bằng ngôn ngữ bản địa của nó, bạn chỉ cần giao tiếp với PDO bằng lập trình hướng đối tượng (OOP). PDO sẽ tự động dịch các yêu cầu của bạn sang ngôn ngữ mà cơ sở dữ liệu hiểu được.


2. Trận chiến: PDO vs MySQLi - Tại sao PDO chiến thắng?

Để hiểu rõ tại sao các framework hiện đại (như Laravel, Symfony) đều xây dựng nền tảng Database dựa trên PDO, hãy xem bảng so sánh sau:

Tiêu chí MySQLi PDO
Hỗ trợ cơ sở dữ liệu Chỉ hỗ trợ duy nhất MySQL. Hỗ trợ hơn 12 loại Database khác nhau (MySQL, PostgreSQL, SQLite, Oracle, SQL Server...).
Phong cách code Hỗ trợ cả Hướng thủ tục (Procedural) và Hướng đối tượng (OOP). Hoàn toàn Hướng đối tượng (OOP). Giúp code gọn gàng và chuẩn mực hơn.
Chống SQL Injection Có hỗ trợ, nhưng cú pháp khá rườm rà. Hỗ trợ cực kỳ mạnh mẽ thông qua Prepared Statements với cú pháp sạch sẽ và dễ đọc.
Tính linh hoạt Nếu dự án đổi DB sang PostgreSQL, bạn phải đập đi viết lại toàn bộ code. Chỉ cần thay đổi 1 dòng cấu hình kết nối duy nhất, toàn bộ code cũ vẫn chạy bình thường.

Kết luận: PDO mang lại sự linh hoạt tuyệt đối và chuẩn mực bảo mật cao hơn. Dùng PDO là bạn đang code theo tư duy của một Backend Developer thực thụ.


3. Cấu trúc kết nối CSDL bằng PDO

Để thiết lập một kết nối từ PHP sang MySQL, chúng ta cần 3 thông tin cơ bản: Tên máy chủ (Host), Tên đăng nhập (Username), và Mật khẩu (Password).

Tuy nhiên, PDO yêu cầu thông tin này phải được đóng gói theo một chuẩn định dạng gọi là DSN (Data Source Name).

Đoạn code kết nối chuẩn trong thực tế thường được đặt trong một file riêng biệt có tên là database.php (hoặc connection.php), sau đó các file khác sẽ dùng lệnh require để gọi vào.

<?php
// 1. Khai báo các hằng số cấu hình
$host = '127.0.0.1'; // Hoặc 'localhost'
$dbName = 'he_thong_ban_ve';
$username = 'root'; // User mặc định của XAMPP/Laragon
$password = '';     // XAMPP/Laragon thường để trống mật khẩu mặc định
$charset = 'utf8mb4'; // Đảm bảo hỗ trợ tiếng Việt có dấu và Emoji

// 2. Tạo chuỗi DSN
$dsn = "mysql:host=$host;dbname=$dbName;charset=$charset";

// 3. Khởi tạo kết nối với Try...Catch để bắt lỗi
try {
    // Khởi tạo đối tượng PDO
    $pdo = new PDO($dsn, $username, $password);
    
    // Thiết lập chế độ báo lỗi nghiêm ngặt (Throw Exception)
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // Thiết lập chế độ lấy dữ liệu mặc định là Mảng kết hợp (Associative Array)
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    echo "Kết nối Cơ sở dữ liệu thành công!";
    
} catch (PDOException $e) {
    // Bắt lỗi nếu kết nối thất bại (Sai pass, sai tên DB, sập Server...)
    die("Lỗi kết nối CSDL: " . $e->getMessage());
}
?>

4. Giải phẫu đoạn code kết nối (Behind the Scenes)

Có 3 điểm mấu chốt bạn cần lưu ý trong đoạn code trên để sau này vận hành không gặp lỗi:

  • Bắt lỗi bằng try...catch: Kết nối Database là một tác vụ có rủi ro cao (phụ thuộc vào mạng, trạng thái server). Nếu kết nối thất bại, PDO sẽ ném ra một ngoại lệ (PDOException). Nếu không dùng khối try...catch để hứng ngoại lệ này, toàn bộ trang web của bạn sẽ bị sập và in thẳng cấu hình Database (gồm cả mật khẩu) ra màn hình trình duyệt. Kỹ thuật try...catch giúp bạn kiểm soát rủi ro đó.
  • PDO::ATTR_ERRMODE_EXCEPTION: Mặc định, PDO chỉ im lặng khi gặp lỗi truy vấn. Thiết lập này ép PDO phải "la lên" (quăng ra Exception) ngay lập tức nếu có bất kỳ câu lệnh SQL nào bị viết sai cú pháp, giúp bạn debug dễ dàng hơn.
  • PDO::FETCH_ASSOC: Mặc định, PDO trả về dữ liệu vừa ở dạng Mảng tuần tự (index 0, 1, 2) vừa ở dạng Mảng kết hợp (key-value), làm nhân đôi bộ nhớ tiêu thụ. Thiết lập này ép PDO chỉ trả về Mảng kết hợp (giống định dạng JSON), giúp tiết kiệm RAM cho máy chủ.

Tổng kết Bài 23

PDO chính là chiếc cầu nối an toàn và hiện đại nhất để kết nối ứng dụng PHP của bạn với MySQL. Bằng cách sử dụng chuẩn DSN và cấu trúc xử lý ngoại lệ try...catch, bạn đã thiết lập được một nền tảng vững chắc.

Bây giờ, ống nước đã được nối xong. Ở bài tiếp theo, chúng ta sẽ bắt đầu bơm dữ liệu qua lại. Hãy chuẩn bị sẵn sàng cho Bài 24: Thực hiện CRUD hoàn chỉnh bằng PHP và PDO (Kết nối, Thêm, Sửa, Xóa, Xem danh sách).


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí