×

Cách viết class để quản lý truy vấn SQL trong PHP

Việc quản lý truy vấn SQL trong PHP là một phần quan trọng trong phát triển ứng dụng web. Để thực hiện điều này một cách hiệu quả và có tổ chức, việc sử dụng class để quản lý truy vấn SQL là một giải pháp hợp lý. Thiết kế một class sẽ giúp bạn dễ dàng tái sử dụng mã nguồn, cải thiện khả năng bảo trì và tăng tính an toàn cho ứng dụng của bạn. Trong bài viết này, chúng ta sẽ tìm hiểu cách viết class quản lý truy vấn SQL trong PHP, bao gồm cách kết nối tới cơ sở dữ liệu, thực hiện các truy vấn cùng với bảo vệ chống tấn công SQL Injection.

Kết nối tới cơ sở dữ liệu

Đầu tiên, chúng ta cần một phương thức để kết nối tới cơ sở dữ liệu. Chúng ta sẽ sử dụng PDO (PHP Data Objects) vì nó cho phép chúng ta thực hiện các truy vấn an toàn và linh hoạt hơn so với cách truyền thống như mysqli.

class Database {
    private $host = 'localhost';
    private $dbname = 'your_database_name';
    private $username = 'your_username';
    private $password = 'your_password';
    private $pdo;

    public function __construct() {
        $this->connect();
    }

    private function connect() {
        try {
            $this->pdo = new PDO("mysql:host=$this->host;dbname=$this->dbname", $this->username, $this->password);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            echo "Connection failed: " . $e->getMessage();
        }
    }

    public function getConnection() {
        return $this->pdo;
    }
}

Thực hiện truy vấn SELECT

Sau khi đã có kết nối tới cơ sở dữ liệu, chúng ta cần có phương thức để thực hiện truy vấn SELECT. Chúng ta sẽ sử dụng prepared statements để bảo vệ chống SQL Injection.

class Database {
    // Các thuộc tính và phương thức như trên...

    public function select($query, $params = []) {
        $stmt = $this->pdo->prepare($query);
        $stmt->execute($params);
        return $stmt->fetchAll();
    }
}

Thực hiện truy vấn INSERT, UPDATE, DELETE

Tương tự, chúng ta cũng cần các phương thức để thực hiện các truy vấn INSERT, UPDATE, DELETE.

class Database {
    // Các thuộc tính và phương thức như trên...

    public function insert($query, $params = []) {
        $stmt = $this->pdo->prepare($query);
        return $stmt->execute($params);
    }

    public function update($query, $params = []) {
        $stmt = $this->pdo->prepare($query);
        return $stmt->execute($params);
    }

    public function delete($query, $params = []) {
        $stmt = $this->pdo->prepare($query);
        return $stmt->execute($params);
    }
}

Ví dụ sử dụng class Database

Bây giờ, hãy xem cách chúng ta có thể sử dụng class Database mà chúng ta đã tạo ra. Giả sử chúng ta có một bảng users trong cơ sở dữ liệu và muốn thực hiện một số truy vấn cơ bản.

$db = new Database();

// Thực hiện truy vấn SELECT
$users = $db->select("SELECT * FROM users WHERE age > ?", [20]);
foreach ($users as $user) {
    echo $user['name'] . "\n";
}

// Thêm một người dùng mới
$db->insert("INSERT INTO users (name, age) VALUES (?, ?)", ['John Doe', 25]);

// Cập nhật thông tin người dùng
$db->update("UPDATE users SET age = ? WHERE name = ?", [26, 'John Doe']);

// Xóa một người dùng
$db->delete("DELETE FROM users WHERE name = ?", ['John Doe']);

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu cách viết một class để quản lý truy vấn SQL trong PHP. Bằng cách sử dụng PDO và prepared statements, chúng ta có thể thực hiện các truy vấn một cách an toàn, hiệu quả và dễ bảo trì. Class Database mà chúng ta xây dựng có thể dễ dàng mở rộng và tùy chỉnh theo nhu cầu của bạn, ví dụ như thêm các phương thức cho việc thực hiện các truy vấn phức tạp hơn, hoặc quản lý các giao dịch.

Việc sử dụng các class như thế này không chỉ giúp cải thiện mã nguồn mà còn giúp bạn giảm thiểu nguy cơ xảy ra các lỗi bảo mật trong ứng dụng web của mình. Hãy bắt đầu áp dụng ngay cho các dự án của bạn để tận hưởng những lợi ích mà nó mang lại!

Comments