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

PHP 基於 MySQLi 的 Model 基類完整實作

     編輯:PHP 綜合知識

PHP MySQLi Model 基類實作

本文展示一個基於 MySQLi 的輕量級 Model 基類,封裝常用資料庫操作:單筆查詢、多筆查詢、增刪改、事務支援、自動獲取下一個自增 ID 等功能。

資料庫連線類:DB.class.php

<?php
class DB {
    // 取得資料庫連線物件
    static public function getDB() {
        $_mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
        
        if (mysqli_connect_errno()) {
            exit('資料庫連線錯誤!錯誤代碼:' . mysqli_connect_error());
        }
        
        $_mysqli->set_charset('utf8');
        return $_mysqli;
    }

    // 清理資源
    static public function unDB(&$_result, &$_db) {
        if (is_object($_result)) {
            $_result->free();
            $_result = null;
        }
        if (is_object($_db)) {
            $_db->close();
            $_db = null;
        }
    }
}
?>

Model 基類:Model.class.php

<?php
class Model {
    // 執行多條 SQL(事務或批次)
    public function multi($_sql) {
        $_db = DB::getDB();
        $_db->multi_query($_sql);
        DB::unDB($_result = null, $_db);
        return true;
    }

    // 獲取下一個自增 ID
    public function nextid($_table) {
        $_sql = "SHOW TABLE STATUS LIKE '$_table'";
        $_object = $this->one($_sql);
        return $_object->Auto_increment;
    }

    // 查詢總筆數
    protected function total($_sql) {
        $_db = DB::getDB();
        $_result = $_db->query($_sql);
        $_total = $_result->fetch_row();
        DB::unDB($_result, $_db);
        return $_total[0];
    }

    // 查詢單筆資料(回傳物件)
    protected function one($_sql) {
        $_db = DB::getDB();
        $_result = $_db->query($_sql);
        $_objects = $_result->fetch_object();
        DB::unDB($_result, $_db);
        return Tool::htmlString($_objects);
    }

    // 查詢多筆資料(回傳物件陣列)
    protected function all($_sql) {
        $_db = DB::getDB();
        $_result = $_db->query($_sql);
        $_html = array();
        while ($_objects = $_result->fetch_object()) {
            $_html[] = $_objects;
        }
        DB::unDB($_result, $_db);
        return Tool::htmlString($_html);
    }

    // 增、刪、改操作(回傳影響行數)
    protected function aud($_sql) {
        $_db = DB::getDB();
        $_db->query($_sql);
        $_affected_rows = $_db->affected_rows;
        DB::unDB($_result = null, $_db);
        return $_affected_rows;
    }
}
?>

配置常數範例(config.inc.php)

<?php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', 'your_password');
define('DB_NAME', 'your_database');
define('DB_PORT', 3306);
?>

繼承使用範例:ArticleModel.php

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

class ArticleModel extends Model {
    private $table = 'articles';

    // 取得文章列表(分頁)
    public function getList($page = 1, $pagesize = 10) {
        $offset = ($page - 1) * $pagesize;
        $sql = "SELECT * FROM {$this->table} ORDER BY created_at DESC LIMIT $offset, $pagesize";
        return $this->all($sql);
    }

    // 取得單篇文章
    public function getById($id) {
        $sql = "SELECT * FROM {$this->table} WHERE id = " . intval($id);
        return $this->one($sql);
    }

    // 新增文章
    public function add($data) {
        $fields = implode(',', array_keys($data));
        $values = "'" . implode("','", array_values($data)) . "'";
        $sql = "INSERT INTO {$this->table} ($fields) VALUES ($values)";
        return $this->aud($sql);
    }

    // 更新文章
    public function update($id, $data) {
        $set = [];
        foreach ($data as $k => $v) {
            $set[] = "`$k` = '$v'";
        }
        $sql = "UPDATE {$this->table} SET " . implode(',', $set) . " WHERE id = " . intval($id);
        return $this->aud($sql);
    }

    // 刪除文章
    public function delete($id) {
        $sql = "DELETE FROM {$this->table} WHERE id = " . intval($id);
        return $this->aud($sql);
    }

    // 取得總數
    public function getTotal($where = '') {
        $sql = "SELECT COUNT(*) FROM {$this->table}" . ($where ? " WHERE $where" : '');
        return $this->total($sql);
    }
}
?>

控制器使用範例

<?php
require_once 'ArticleModel.php';

$model = new ArticleModel();

// 列表頁
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$articles = $model->getList($page, 10);
$total = $model->getTotal();

// 新增處理
if ($_POST['action'] === 'add') {
    $data = [
        'title' => $_POST['title'],
        'content' => $_POST['content'],
        'created_at' => date('Y-m-d H:i:s')
    ];
    $model->add($data);
    header('Location: list.php');
}
?>

架構優勢與注意事項

  • 資源自動釋放:每次查詢自動關閉連線與釋放結果集,避免連線洩漏
  • 統一字元編碼:強制設定 UTF-8 避免中文亂碼
  • SQL 注入風險:原始碼未使用預處理語句,實際專案請改用 prepare() + bind_param()
  • 錯誤處理:建議加入 try-catch 與日誌記錄
  • 連線池優化:高併發場景建議使用持久連線或連線池

改進方向

  1. 引入 PDO 替代 MySQLi 以支援多資料庫
  2. 實作 Query Builder 鏈式呼叫語法
  3. 加入資料驗證層(Validation)
  4. 支援關聯查詢與 Eager Loading
  5. 整合 PSR-3 日誌介面
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved