帝國 CMS 封裝了 mysqlquery 類(位於 e/class/db_sql.php),直接使用框架原生資料庫類別可減少依賴、提升效率、統一錯誤處理。本文詳細說明連線建立、核心方法(query、query1、fetch 系列)與實戰測試代碼。
<?php // 1. 引入核心設定與資料庫類別 require_once '../../class/connect.php'; // 含資料庫連線參數、常數定義 require_once '../../class/db_sql.php'; // mysqlquery 類別定義 // 2. 建立連線並實例化 $link = db_connect(); // 回傳 MySQL 連線資源 $empire = new mysqlquery(); // 實例化資料庫操作類 // ... 此處執行各種查詢操作 ... // 3. 關閉連線並釋放資源 db_close(); $empire = null; ?>
| 方法 | 對應原生函數 | 成功回傳 | 失敗行為 | 適用場景 |
|---|---|---|---|---|
| query($sql) | mysql_query() | Resource / true | die() 終止腳本,輸出錯誤訊息與 SQL | 關鍵操作、必須成功的 DDL/DML |
| query1($sql) | mysql_query() | Resource / true | 回傳 false,不終止腳本 | 一般查詢、需自行判斷失敗處理 |
<?php
require_once '../../class/connect.php';
require_once '../../class/db_sql.php';
$link = db_connect();
$empire = new mysqlquery();
function hr() { echo '<hr />'; }
// 1. 查詢成功 → 回傳 Resource
$sql = $empire->query("SELECT id, title FROM {$dbtbpre}ecms_news");
var_dump($sql); hr();
// 2. 更新成功 → 回傳 true
$sql = $empire->query("UPDATE {$dbtbpre}ecms_news SET title='標題' WHERE id=1");
var_dump($sql); hr();
// 3. 更新失敗(欄位不存在) → die() 輸出錯誤,後續代碼不執行
$sql = $empire->query("UPDATE {$dbtbpre}ecms_news SET titlesss='標題' WHERE id=1");
var_dump($sql); // 不會執行到這裡
hr();
db_close();
$empire = null;
?>
query() 失敗時輸出範例:
MySQL Error: Unknown column 'titlesss' in 'field list' UPDATE ***_ecms_news SET titlesss='標題' WHERE id=1
<?php
require_once '../../class/connect.php';
require_once '../../class/db_sql.php';
$link = db_connect();
$empire = new mysqlquery();
function hr() { echo '<hr />'; }
// 1. 查詢成功
$sql = $empire->query1("SELECT id, title FROM {$dbtbpre}ecms_news");
var_dump($sql); hr(); // resource
// 2. 更新成功
$sql = $empire->query1("UPDATE {$dbtbpre}ecms_news SET title='測試更新標題' WHERE id=1");
var_dump($sql); hr(); // true
// 3. 更新失敗 → 回傳 false,腳本繼續
$sql = $empire->query1("UPDATE {$dbtbpre}ecms_news SET titlesss='測試更新標題' WHERE id=1");
var_dump($sql); hr(); // false
db_close();
$empire = null;
?>
| 方法 | 說明 | 範例 |
|---|---|---|
| fetch($sql) | 取得單行關聯陣列,指標前進 | $row = $empire->fetch($sql); |
| fetch1($sql) | 直接取得第一行關聯陣列(內部已執行 query) | $row = $empire->fetch1("SELECT * FROM table WHERE id=1"); |
| fetch2($sql) | 取得單行數值陣列(索引 0,1,2...) | $row = $empire->fetch2($sql); |
| num($sql) | 取得結果集行數 | $count = $empire->num($sql); |
| free($sql) | 釋放結果集記憶體 | $empire->free($sql); |
<?php
require_once '../../class/connect.php';
require_once '../../class/db_sql.php';
$link = db_connect();
$empire = new mysqlquery();
// Create
$empire->query1("INSERT INTO {$dbtbpre}ecms_news (title, newstime) VALUES ('新文章', '".time()."')");
$new_id = $empire->lastid(); // 取得自增 ID
// Read
$sql = $empire->query1("SELECT * FROM {$dbtbpre}ecms_news WHERE id=$new_id");
$row = $empire->fetch($sql);
echo $row['title'];
// Update
$empire->query1("UPDATE {$dbtbpre}ecms_news SET title='更新標題' WHERE id=$new_id");
// Delete
$empire->query1("DELETE FROM {$dbtbpre}ecms_news WHERE id=$new_id");
db_close();
$empire = null;
?>
intval()、addslashes() 或 $empire->escape()(若有)處理變數{$dbtbpre} 常數,確保多站點/備份相容query()(失敗即停),一般讀取用 query1() 搭配 if (!$sql) { ... }mysqliquery 類別善用帝國 CMS 內建 mysqlquery 類別,能簡化資料庫操作代碼、統一錯誤處理、減少外部依賴。核心在於理解 query()(嚴格)與 query1()(寬鬆)的失敗行為差異,並配合 fetch 系列方法高效擷取資料。