面對繁瑣的 SQL 拼接與重複的 CRUD 程式碼,這個不足 100 行的 Model 類提供了鏈式呼叫、自動組裝 SQL、支援多表操作的輕量解決方案,極適合快速原型開發與中小型專案。
$user->field('id,name')->where('id>3')->order('id desc')->limit(5)->select()mysql_* 函式(註:生產環境建議升級至 PDO/MySQLi)M('table') 快速實例化<?php
/**
* 輕量級資料庫操作類 Model
* @author summer <wenghang1228@me.com>
* @version 1.0
*/
class Model {
public $field, $tabname, $where, $order, $limit;
// 建構子:連線資料庫、設定資料表
public function __construct($tabname) {
mysql_connect(HOST, USER, PASSWORD);
mysql_select_db(DBNAME);
mysql_query("SET NAMES utf8");
$this->tabname = $tabname;
}
// 鏈式方法:皆回傳 $this
public function field($field) { $this->field = $field; return $this; }
public function where($where) { $this->where = "WHERE $where"; return $this; }
public function order($order) { $this->order = "ORDER BY $order"; return $this; }
public function limit($limit) { $this->limit = "LIMIT $limit"; return $this; }
// 查詢
public function select($all = "") {
$sql = $all
? "SELECT {$all} FROM {$this->tabname} ORDER BY id"
: "SELECT {$this->field} FROM {$this->tabname} {$this->where} {$this->order} {$this->limit}";
$rst = mysql_query($sql);
while ($row = mysql_fetch_assoc($rst)) $rows[] = $row;
return $rows ?? [];
}
// 新增
public function insert($post) {
foreach ($post as $k => $v) { $keys[] = $k; $vals[] = "'$v'"; }
$sql = "INSERT INTO {$this->tabname} (" . implode(',', $keys) . ") VALUES (" . implode(',', $vals) . ")";
return mysql_query($sql) ? mysql_insert_id() : false;
}
// 刪除
public function delete() {
$sql = "DELETE FROM {$this->tabname} {$this->where}";
return mysql_query($sql) ? mysql_affected_rows() : false;
}
// 更新
public function update($post) {
foreach ($post as $k => $v) $sets[] = "$k='$v'";
$sql = "UPDATE {$this->tabname} SET " . implode(',', $sets) . " {$this->where}";
return mysql_query($sql) ? mysql_affected_rows() : false;
}
// 取單筆
public function find() {
$sql = $this->order
? "SELECT * FROM {$this->tabname} {$this->order} LIMIT 1"
: "SELECT * FROM {$this->tabname} ORDER BY id LIMIT 1";
$rst = mysql_query($sql);
return mysql_fetch_assoc($rst) ?: false;
}
// 總筆數
public function total() {
$rst = mysql_query("SELECT COUNT(*) FROM {$this->tabname}");
return $rst ? mysql_fetch_row($rst)[0] : false;
}
}
// 工廠函式
function M($tabname) { return new Model($tabname); }
// 設定常數(實際專案請放入配置檔)
define("HOST", "localhost");
define("USER", "root");
define("PASSWORD", "123456");
define("DBNAME", "test");
// 使用範例
$user = M("user");
$list = $user->field("id,name")->where("id>3")->order("id desc")->limit("3")->select();
?>
insert() 中 $valu 應為 $v,$keystr 應為 $keyStrupdate() 中 $psot 應為 $post,$val 應為 $vdelete() 方法名拼寫錯誤 delect → delete| 適用 | 不適用 |
|---|---|
| 中小型專案、快速原型、內部管理系統 | 高併發、大數據量、需事務支援、嚴格 SQL 注入防護的生產環境 |
mysql_* 替換為 PDO 預處理語句,徹底防禦 SQL 注入beginTransaction/commit/rollback)這個類雖簡單,卻展現了「約定優於配置」與「流暢介面」的設計哲學,是理解 ORM 核心思想的絕佳入門教材。