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

PHP MySQL 資料庫操作類(Discuz 風格)完整原始碼與用法解析

     編輯:PHP 綜合知識

本文整理一款輕量級 MySQL 操作類,源自 Discuz! 核心資料庫層簡化版,支援持久連線、字元集自動設定、SQL 錯誤攔截、查詢計數、Unbuffered 查詢等實用功能,適合中小型專案快速整合。

完整類別程式碼

<?php
/**
 * dbQuery - 精簡版 MySQL 操作類
 * 參考 Discuz! 核心 DB 層簡化
 */
class dbQuery {
    public $querynum = 0;
    public $link = null;

    /**
     * 連線資料庫
     * @param string $dbhost 主機
     * @param string $dbuser 用戶
     * @param string $dbpw   密碼
     * @param string $dbname 資料庫
     * @param int    $pconnect 是否持久連線
     */
    public function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0) {
        $func = $pconnect ? 'mysql_pconnect' : 'mysql_connect';
        if (!($this->link = @$func($dbhost, $dbuser, $dbpw))) {
            $this->halt('Can not connect to MySQL server');
        }

        // MySQL 4.1+ 字元集設定
        if ($this->version() > '4.1') {
            global $dbcharset;
            if ($dbcharset) {
                mysql_query("SET character_set_connection=$dbcharset, character_set_results=$dbcharset, character_set_client=binary", $this->link);
                mysql_query("SET NAMES '$dbcharset'", $this->link);
            }
            // MySQL 5.0.1+ sql_mode
            if ($this->version() > '5.0.1') {
                mysql_query("SET sql_mode=''", $this->link);
            }
        }

        if ($dbname) {
            mysql_select_db($dbname, $this->link);
        }
    }

    public function select_db($dbname) {
        return mysql_select_db($dbname, $this->link);
    }

    public function fetch_array($query, $result_type = MYSQL_ASSOC) {
        return mysql_fetch_array($query, $result_type);
    }

    /**
     * 執行 SQL 查詢
     * @param string $sql
     * @param string $type 'UNBUFFERED'|'SILENT'|''
     * @return resource|false
     */
    public function query($sql, $type = '') {
        $func = ($type == 'UNBUFFERED' && function_exists('mysql_unbuffered_query'))
            ? 'mysql_unbuffered_query' : 'mysql_query';
        if (!($query = $func($sql, $this->link)) && $type != 'SILENT') {
            $this->halt('MySQL Query Error', $sql);
        }
        $this->querynum++;
        return $query;
    }

    public function affected_rows() { return mysql_affected_rows($this->link); }
    public function error() { return $this->link ? mysql_error($this->link) : mysql_error(); }
    public function errno() { return intval($this->link ? mysql_errno($this->link) : mysql_errno()); }
    public function result($query, $row) { return @mysql_result($query, $row); }
    public function num_rows($query) { return mysql_num_rows($query); }
    public function num_fields($query) { return mysql_num_fields($query); }
    public function free_result($query) { return mysql_free_result($query); }
    public function insert_id() {
        $id = mysql_insert_id($this->link);
        return $id >= 0 ? $id : $this->result($this->query("SELECT LAST_INSERT_ID()"), 0);
    }
    public function fetch_row($query) { return mysql_fetch_row($query); }
    public function fetch_fields($query) { return mysql_fetch_field($query); }
    public function version() { return mysql_get_server_info($this->link); }
    public function close() { return mysql_close($this->link); }

    /**
     * 錯誤中斷輸出
     */
    public function halt($message = '', $sql = '') {
        echo $message . ' ' . $sql;
        exit;
    }
}
?>

使用範例

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

$db = new dbQuery();
$db->connect('localhost', 'root', 'password', 'mydb', 0); // 0=非持久

// 查詢
$sql = "SELECT uid, username, email FROM members WHERE status=1 LIMIT 10";
$query = $db->query($sql);
while ($row = $db->fetch_array($query)) {
    echo "{$row['username']} <{$row['email']}>
"; } $db->free_result($query); // 寫入 $ins = "INSERT INTO logs (action, uid, dateline) VALUES ('login', 1001, " . time() . ")"; $db->query($ins); echo "新增 ID: " . $db->insert_id(); // 統計 echo "本頁查詢次數: " . $db->querynum; $db->close(); ?>

關鍵特性解析

特性說明
自動字元集偵測 MySQL ≥ 4.1 自動送出 SET NAMES,解決中文亂碼
sql_mode 清空MySQL ≥ 5.0.1 自動關閉嚴格模式,相容舊 SQL 寫法
Unbuffered 查詢大量資料匯出時設 UNBUFFERED 減少記憶體佔用
SILENT 模式不中斷執行,自行檢查 errno()/error()
查詢計數$db->querynum 可用於效能監控與除錯

⚠️ 重要遷移提醒

PHP 7.0+ 已移除 `mysql_*` 擴充套件。新專案請改用:

  • PDO:資料庫抽象層,支援多種驅動,支援預處理語句。
  • mysqli:MySQL 專用增強版,程式風格相近,易遷移。

PDO 等效寫法速查

<?php
$pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8mb4', 'root', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,
]);

// 查詢
$stmt = $pdo->query("SELECT * FROM members WHERE status=1 LIMIT 10");
foreach ($stmt as $row) { /* ... */ }

// 預處理寫入
$stmt = $pdo->prepare("INSERT INTO logs (action, uid, dateline) VALUES (?, ?, ?)");
$stmt->execute(['login', 1001, time()]);
echo "新增 ID: " . $pdo->lastInsertId();
?>

此類別適合維護 PHP 5.x 舊專案;現代開發請直接採用 PDO 或 mysqli,享受預處理語句、異常處理、多資料庫支援等現代特性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved