首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP CURD 實戰精要:用戶增刪改查完整流程與核心方法解析

     編輯:PHP 相關知識

ThinkPHP CURD 實戰精要:用戶增刪改查完整流程與核心方法解析

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());
        }
    }
}
?>

模板文件關鍵片段

列表頁 + 註冊表單 (index.html)

<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>

編輯頁面 (edit.html)

<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()查詢多條記錄返回二維數組

進階技巧:setInc/setDec 計數器

文章提到的「登入次數+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 = ?`,高併發下無競爭條件。

安全與規範建議

  1. 密碼加密:棄用 MD5,改用 password_hash() + password_verify() (PHP 5.5+)
  2. 輸入過濾:模型定義 `_validate` 規則,或控制器用 `I('post.username', '', 'htmlspecialchars')`
  3. CSRF 防護:表單添加 ``
  4. 權限控制:編輯/刪除前驗證 `session('user.id') == $id` 或 RBAC 權限
  5. 軟刪除:表添加 `status`/`deleted_at` 字段,邏輯刪除替代物理刪除

遷移至 ThinkPHP 6/8 關鍵變化

  • 模型類繼承 `think\Model`,使用靜態方法 `User::get($id)`、`User::destroy($id)`
  • 控制器繼承 `think\Controller`,返回 `json()`/`view()`/`redirect()`
  • 模板語法改為 `{$vo.username}`、`{volist name="user" id="vo"}`
  • 驗證器類 `think\Validate` 替代模型內 `_validate`

掌握 CURD 不僅是記住 API,更要理解「數據流向:請求→驗證→模型→數據庫→響應」的完整鏈路,並養成安全第一、可維護性優先的編碼習慣。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved