CURD(Create、Update、Read、Delete)是所有業務開發的基石。本文基於 ThinkPHP 3.x 風格,通過一個完整的「用戶管理」模塊,系統梳理模型操作、表單處理、數據驗證、模板輸出等核心環節,並指出常見坑點與最佳實踐。
<?php
class IndexAction extends Action {
// 列表頁:讀取所有用戶
public function index() {
header("Content-Type: text/html; charset=utf-8");
$user = M('user');
$list = $user->select();
$this->assign('user', $list);
$this->display();
}
// 新增用戶:表單提交處理
public function add() {
$user = M('user');
if ($user->create()) { // 自動驗證+自動完成(若配置)
$user->cip = get_client_ip(); // 註冊 IP
$user->ctime = time(); // 註冊時間
$user->password = md5($_POST['password']); // 密碼加密
if ($user->add()) {
$this->success('用戶註冊成功', '/admin.php/index/edit');
} else {
$this->error($user->getError());
}
} else {
$this->error($user->getError());
}
}
// 刪除用戶:按 ID 刪除
public function delete($id) {
$user = M('user');
if ($user->where("id=$id")->delete()) {
$this->success('刪除成功');
} else {
$this->error('刪除失敗');
}
}
// 編輯頁面:回顯用戶信息
public function edit($id) {
$user = M('user');
$id = (int)$id;
$list = $user->where("id=$id")->find();
$this->assign('list', $list);
$this->display();
}
// 更新用戶:處理編輯提交
public function update() {
$user = M('user');
if ($user->create()) {
$user->ctime = time(); // 更新時間
if ($user->save()) {
$this->success('更新成功');
} else {
$this->error('更新失敗');
}
} else {
$this->error($user->getError());
}
}
}
?>
<form action="__URL__/add" method="post">
用戶名<input type="text" name="username">
密碼<input type="password" name="password">
<input type="submit" value="提交">
</form>
<volist name="user" id="vo">
用戶名: <input name="username" value="<{$vo.username}>" disabled>
密碼: <input name="password" value="<{$vo.password}>" disabled>
註冊IP: <input name="cip" value="<{$vo.cip}>" disabled>
註冊時間: <{$vo.ctime|date='Y-m-d H:i:s', ###}>
<a href="__URL__/edit/id/<{$vo.id}>">編輯</a>
<a href="__URL__/delete/id/<{$vo.id}>" onclick="return confirm('確定刪除?')">刪除</a>
</volist>
<form action="__URL__/update" method="post">
<input type="hidden" name="id" value="<{$list.id}>">
用戶名: <input type="text" name="username" value="<{$list.username}>">
密碼: <input type="password" name="password" value="" placeholder="留空不修改">
<input type="submit" value="保存">
</form>
| 方法 | 用途 | 關鍵點 |
|---|---|---|
M('user') | 實例化 User 模型 | 對應表 `think_user`(默認前綴) |
create() | 自動驗證+數據對象創建 | 需在模型定義 `_validate`/`_auto` 規則 |
add() | 插入新記錄 | 返回新增 ID,失敗返回 false |
save() | 更新記錄 | 依賴主鍵值(通常隱藏域傳遞 id) |
delete() | 刪除記錄 | 配合 `where()` 指定條件 |
find() | 查詢單條記錄 | 返回關聯數組 |
select() | 查詢多條記錄 | 返回二維數組 |
文章提到的「登入次數+1」場景,無需讀取-修改-寫入三步操作,直接用原子計數器:
$user = M('user');
$user->where("id=$uid")->setInc('login_count', 1); // 登入次數 +1
$user->where("id=$uid")->setDec('balance', 10); // 餘額 -10
底層執行 `UPDATE user SET login_count = login_count + 1 WHERE id = ?`,高併發下無競爭條件。
password_hash() + password_verify() (PHP 5.5+)掌握 CURD 不僅是記住 API,更要理解「數據流向:請求→驗證→模型→數據庫→響應」的完整鏈路,並養成安全第一、可維護性優先的編碼習慣。