在PHP 開發中,數據庫連接是基礎且關鍵的一環。一個高效且安全的數據庫連接類不僅能夠簡化開發流程,還能有效防止SQL 注入等安全風險。本文將介紹如何封裝一個安全的connect()函數,並實現防止SQL 注入的數據庫連接方式。
直接使用原生的mysqli_connect()或PDO連接數據庫雖然方便,但缺乏封裝的話,代碼易重複且難維護。通過面向對象封裝,可以實現:
統一管理數據庫連接配置
提高代碼復用性
集中處理異常和錯誤
結合預處理語句防止SQL 注入
PHP 中推薦使用PDO(PHP Data Objects)作為數據庫連接接口,理由:
支持多種數據庫,代碼可移植性高
內置預處理語句,防止SQL 注入
異常處理機製完善
<?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]);
?>
使用PDO 預處理語句,SQL 語句與數據分離,用戶輸入不會直接拼接到SQL 字符串中
參數綁定讓數據庫驅動自動處理特殊字符轉義
禁用模擬預處理,使用原生預處理增強安全性
封裝一個connect()函數的數據庫連接類,選擇PDO 作為底層連接,結合預處理語句,是PHP 中防止SQL 注入的高效且安全方案。該類的設計簡潔且易於擴展,可以滿足大多數業務需求,是現代PHP 開發的推薦做法。