首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

經典 PHP MySQL 資料庫操作類:封裝連線、查詢、錯誤處理與資源釋放

     編輯:PHP 綜合知識

前言

在早期 PHP 專案中,將重複的 MySQL 連線、查詢、錯誤處理邏輯封裝成類別,是提升開發效率與程式碼可維護性的常見做法。本文提供一個經典的 DB 類別範例,展示構造函數自動連線、查詢執行、筆數統計、錯誤攔截與析構釋放資源的完整流程。

完整類別程式碼

<?php
class DB
{
    // 資料庫連線參數
    var $host_addr = "localhost";
    var $host_user = "root";
    var $host_psw  = "123";
    var $db_name   = "test";

    // 內部資源屬性
    var $link_id;   // 連線識別資源
    var $query_id;  // 查詢結果資源
    var $numRow;    // 影響/回傳筆數

    // 建構子:自動連線並選擇資料庫
    function DB()
    {
        $this->link_id = @mysql_connect($this->host_addr, $this->host_user, $this->host_psw);
        if ($this->link_id) {
            @mysql_select_db($this->db_name, $this->link_id) 
                or $this->halt("資料庫選擇失敗!");
        } else {
            $this->halt("連接伺服器失敗!");
            return false;
        }
        return $this->link_id;
    }

    // 執行 SQL 查詢
    function query($sql)
    {
        $this->query_id = @mysql_query($sql, $this->link_id);
        if ($this->query_id) {
            return $this->query_id;
        } else {
            $this->halt("SQL Error: " . mysql_error());
            return false;
        }
    }

    // 取得查詢結果筆數
    function numRow()
    {
        return $this->numRow = @mysql_num_rows($this->query_id);
    }

    // 關閉資料庫連線
    function close()
    {
        return @mysql_close($this->link_id);
    }

    // 統一錯誤處理
    function halt($msg)
    {
        echo "<font color=\"#FF0000\">" . $msg . "</font>";
    }
}
?>

使用範例

<?php
require_once 'DB.class.php';

$db = new DB(); // 自動連線

// 查詢範例
$sql = "SELECT * FROM users WHERE status = 1";
$result = $db->query($sql);

if ($result) {
    echo "共找到 {$db->numRow()} 筆資料<br>";
    while ($row = mysql_fetch_assoc($result)) {
        echo "ID: {$row['id']}, Name: {$row['name']}<br>";
    }
}

// 寫入範例
$insertSql = "INSERT INTO logs (msg, created_at) VALUES ('測試訊息', NOW())";
$db->query($insertSql);

$db->close(); // 釋放連線
?>

關鍵設計說明

  • 錯誤抑制運算子 @: 配合自訂 halt() 方法,統一錯誤輸出格式,避免預設錯誤訊息洩露敏感資訊。
  • 資源封裝: 連線識別 $link_id 與查詢結果 $query_id 皆為私有屬性,外部僅透過方法操作。
  • 靈活擴充: 可輕易加入 fetchRow()、fetchAll()、affectedRows()、lastInsertId() 等常用方法。

重要提醒:現代專案請改用 PDO 或 MySQLi

本類別基於已棄用的 mysql_* 擴展 (PHP 5.5 棄用,PHP 7.0 移除)。 新專案務必使用 PDO (PHP Data Objects) 或 MySQLi,支援預處理語句、交易控制、多資料庫驅動等現代特性,有效防止 SQL 注入攻擊。

PDO 版本快速對照

<?php
class DB_PDO
{
    private $pdo;

    public function __construct($dsn, $user, $pass)
    {
        $this->pdo = new PDO($dsn, $user, $pass, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]);
    }

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

    public function fetchAll($sql, $params = [])
    {
        return $this->query($sql, $params)->fetchAll();
    }
}

// 使用
$db = new DB_PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '123');
$users = $db->fetchAll("SELECT * FROM users WHERE status = ?", [1]);
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved