ECMall 封裝資料庫操作於 `db()` 工廠函式,回傳資料庫物件支援鏈式查詢。本文整理最常用的 6 大查詢方法,適合二次開發快速上手。
<?php $db = &db(); // 取得資料庫物件實例 (引用傳回) // 或 $db = ecmall_db::instance(); // 視版本而定 ?>
<?php
$user = $db->getrow("SELECT * FROM ecm_member WHERE user_id = 111");
print_r($user);
/*
Array
(
[user_id] => 111
[user_name] => 'john'
[email] => 'john@example.com'
...
)
*/
?>
<?php
$ids = $db->getcol("SELECT user_id FROM ecm_member WHERE status = 1");
print_r($ids); // [111, 112, 113, ...]
?>
<?php
$users = $db->getall("SELECT user_id, user_name, email FROM ecm_member WHERE status = 1 LIMIT 10");
foreach ($users as $row) {
echo "{$row['user_name']} <{$row['email']}>\n";
}
?>
<?php
$count = $db->getone("SELECT COUNT(*) FROM ecm_member");
echo "總會員數: $count";
$maxId = $db->getone("SELECT MAX(user_id) FROM ecm_member");
echo "最大 ID: $maxId";
?>
<?php
// 更新
$db->query("UPDATE ecm_member SET last_login = " . gmtime() . " WHERE user_id = 111");
// 刪除
$db->query("DELETE FROM ecm_member WHERE user_id = 999");
// 建表
$db->query("CREATE TABLE tmp_log (id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255))");
?>
<?php
$db->query("INSERT INTO ecm_member (user_name, email, reg_time) VALUES ('newuser', 'new@test.com', " . gmtime() . ")");
$newId = $db->insert_id();
echo "新會員 ID: $newId";
?>
<?php
function memberList(int $page = 1, int $pageSize = 20): array {
$db = &db();
$offset = ($page - 1) * $pageSize;
// 總數
$total = (int)$db->getone("SELECT COUNT(*) FROM ecm_member WHERE status = 1");
// 分頁資料
$sql = "SELECT user_id, user_name, email, reg_time FROM ecm_member WHERE status = 1 ORDER BY user_id DESC LIMIT $offset, $pageSize";
$list = $db->getall($sql);
return [
'total' => $total,
'page' => $page,
'page_size' => $pageSize,
'list' => $list,
];
}
// 使用
$result = memberList(1, 10);
echo "共 {$result['total']} 筆\n";
foreach ($result['list'] as $m) {
echo "{$m['user_id']} | {$m['user_name']} | {$m['email']}\n";
}
?>
| 主題 | 說明 |
|---|---|
| SQL 注入防範 | 所有變數**必須**經過 `$db->escape()` 或參數化 (若支援)。 `$sql = "SELECT * FROM t WHERE name = '" . $db->escape($name) . "'";` |
| 事務控制 | `$db->query('START TRANSACTION');` → 操作 → `$db->query('COMMIT');` / `$db->query('ROLLBACK');` |
| 預處理語句 | 部分版本支援 `$db->prepare()` / `$stmt->execute()`,優先使用。 |
| 錯誤處理 | 查詢失敗回傳 `false`,建議封裝工具函式拋出異常或記錄日誌。 |
| 模型層優先 | 業務邏輯**優先使用模型** `&m('member')->get($id)`,封裝驗證、快取、關聯,直接操作 DB 僅用於複雜報表/遷移/修復。 |
| 引用傳回 `&db()` | 舊版 PHP 需 `&` 確保單例,PHP 5+ 物件預設引用行為,可省略 `&`。 |
<?php
$model = &m('member');
// 單筆
$model->get($userId); // 主鍵查詢
$model->getOne(['email' => $email]); // 條件查單筆
// 多筆
$model->find(['status' => 1], ['limit' => 10, 'order' => 'user_id DESC']);
// 新增
$model->add(['user_name' => 'xxx', 'email' => 'xxx@test.com']);
// 更新
$model->edit($userId, ['last_login' => gmtime()]);
// 刪除
$model->drop($userId); // 軟刪除或硬刪視模型定義
?>