當前位置: 首頁> 最新文章列表> 如何封裝一個安全的connect() 數據庫連接類

如何封裝一個安全的connect() 數據庫連接類

M66 2025-05-24

在PHP 開發中,數據庫連接是基礎且關鍵的一環。一個高效且安全的數據庫連接類不僅能夠簡化開發流程,還能有效防止SQL 注入等安全風險。本文將介紹如何封裝一個安全的connect()函數,並實現防止SQL 注入的數據庫連接方式。


一、封裝數據庫連接類的必要性

直接使用原生的mysqli_connect()PDO連接數據庫雖然方便,但缺乏封裝的話,代碼易重複且難維護。通過面向對象封裝,可以實現:

  • 統一管理數據庫連接配置

  • 提高代碼復用性

  • 集中處理異常和錯誤

  • 結合預處理語句防止SQL 注入

二、選擇PDO 作為連接方式

PHP 中推薦使用PDO(PHP Data Objects)作為數據庫連接接口,理由:

  • 支持多種數據庫,代碼可移植性高

  • 內置預處理語句,防止SQL 注入

  • 異常處理機製完善

三、示例代碼:安全且高效的connect() 類

<?php

class Database {
    private $host = 'localhost';
    private $dbname = 'testdb';
    private $username = 'root';
    private $password = 'password';
    private $pdo;
    private $error;

    // 構造函數,初始化連接
    public function __construct() {
        $dsn = "mysql:host={$this->host};dbname={$this->dbname};charset=utf8mb4";
        $options = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, // 拋出例外
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,       // 默認關聯數組
            PDO::ATTR_EMULATE_PREPARES   => false,                  // 禁用模擬預處理,使用原生預處理
        ];

        try {
            $this->pdo = new PDO($dsn, $this->username, $this->password, $options);
        } catch (PDOException $e) {
            $this->error = $e->getMessage();
            // 記錄日誌或處理錯誤
            die("數據庫連接失敗: " . $this->error);
        }
    }

    // 統一執行查詢(SELECT)
    public function query($sql, $params = []) {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchAll();
    }

    // 統一執行增刪改(INSERT/UPDATE/DELETE)
    public function execute($sql, $params = []) {
        $stmt = $this->pdo->prepare($sql);
        return $stmt->execute($params);
    }

    // 獲取最後插入ID
    public function lastInsertId() {
        return $this->pdo->lastInsertId();
    }
}

?>

四、使用示例

<?php

$db = new Database();

// 安全查詢示例:防止 SQL 注入
$userId = 123;
$result = $db->query("SELECT * FROM users WHERE id = :id", ['id' => $userId]);

// 安全插入示例
$name = '張三';
$email = 'zhangsan@m66.net';
$insertSql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$db->execute($insertSql, ['name' => $name, 'email' => $email]);

?>

五、為什麼這樣設計能防止SQL 注入?

  • 使用PDO 預處理語句,SQL 語句與數據分離,用戶輸入不會直接拼接到SQL 字符串中

  • 參數綁定讓數據庫驅動自動處理特殊字符轉義

  • 禁用模擬預處理,使用原生預處理增強安全性

六、總結

封裝一個connect()函數的數據庫連接類,選擇PDO 作為底層連接,結合預處理語句,是PHP 中防止SQL 注入的高效且安全方案。該類的設計簡潔且易於擴展,可以滿足大多數業務需求,是現代PHP 開發的推薦做法。