本文展示一個基於 MySQLi 的輕量級 Model 基類,封裝常用資料庫操作:單筆查詢、多筆查詢、增刪改、事務支援、自動獲取下一個自增 ID 等功能。
<?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;
}
}
}
?>
<?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;
}
}
?>
<?php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', 'your_password');
define('DB_NAME', 'your_database');
define('DB_PORT', 3306);
?>
<?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');
}
?>
prepare() + bind_param()