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

ThinkPHP 用戶註冊登錄留言完整實戰教程

     編輯:PHP 相關知識

本文通過完整代碼示例,演示如何在 ThinkPHP 框架中實現用戶註冊、登錄、登出及留言發布/管理功能。重點講解模型實例化、自動驗證、Cookie 處理及 CRUD 操作的核心邏輯。

核心控制器代碼

UserAction.class.php - 用戶認證控制器

<?php
class UserAction extends Action {
    // 用戶註冊處理
    public function add() {
        $user = D("user");           // 必須用 D() 實例化模型以啟用自動驗證
        $user->create();
        $result = $user->add();
        if ($result) {
            $this->assign("jumpUrl", "__APP__/index/index");
            $this->success('註冊成功!');
        } else {
            $this->assign("jumpUrl", "__APP__/user/register");
            $this->error($user->getError());
        }
    }

    public function register() { $this->display(); }
    public function login()    { $this->display(); }

    // 登錄驗證
    public function checklogin() {
        $username = $_POST['username'];
        $passwd   = $_POST['passwd'];
        $user     = D("user");
        $userinfo = $user->where("username='$username'")->find();

        if (!empty($userinfo)) {
            if ($userinfo['passwd'] == $passwd) {
                Cookie::set('userid',      $userinfo['id'], time()+3600*24);
                Cookie::set('username',    $username,       time()+3600*24);
                Cookie::set('lastlogintime', time(),         time()+3600*24);
                $this->assign("jumpUrl", "__APP__/index/index");
                $this->success('登陸成功!');
            } else {
                $this->assign("jumpUrl", "__APP__/user/login");
                $this->error('密碼錯誤,請重新輸入!');
            }
        } else {
            $this->assign("jumpUrl", "__APP__/user/login");
            $this->error('用戶名不存在!');
        }
    }

    // 登出
    public function loginout() {
        Cookie::delete('username');
        Cookie::delete('lastlogintime');
        $this->assign("jumpUrl", "__APP__/index/index");
        $this->success('您已成功退出,歡迎下次登錄!');
    }
}
?>

IndexAction.class.php - 留言管理控制器

<?php
class IndexAction extends Action {
    // 發布留言
    public function insert() {
        $content = new ContentModel();
        if (!$content->create()) {
            $this->assign("jumpUrl", "__URL__/index");
            $this->error($content->getError());
        } else {
            $content->userid = Cookie::get('userid');
            $content->add();
            $this->assign("jumpUrl", "__URL__/index");
            $this->success('添加成功!');
        }
    }

    // 留言列表
    public function index() {
        $content = new ContentModel();
        $list = $content->findAll();
        $this->assign('list', $list);
        $this->assign('username',     Cookie::get('username'));
        $this->assign('lastlogintime', Cookie::get('lastlogintime'));
        $this->assign('title', '我的首頁');
        $this->display();
    }

    // 刪除留言
    public function delete() {
        $content = new ContentModel();
        $id = $_GET['id'];
        if ($content->where("id=$id")->delete()) {
            $this->assign("jumpUrl", "__URL__/index");
            $this->success('刪除成功!');
        } else {
            $this->assign("jumpUrl", "__URL__/index");
            $this->error('刪除失敗!');
        }
    }

    // 編輯留言
    public function edit() {
        $content = new ContentModel();
        $id = $_GET['id'];
        if ($id) {
            $data = $content->where("id=$id")->select();
            if (!empty($data)) $this->assign('data', $data);
        }
        $this->assign('title', '編輯頁面');
        $this->display();
    }

    // 更新留言
    public function update() {
        $content = new ContentModel();
        $id = $_POST['id'];
        if ($id) {
            $data['id']      = $id;
            $data['title']   = $_POST['title'];
            $data['content'] = $_POST['content'];
            if ($content->save($data)) {
                $this->assign("jumpUrl", "__URL__/index");
                $this->success('更新數據成功!');
            } else {
                $this->assign("jumpUrl", "__URL__/index");
                $this->error('更新數據失敗!');
            }
        } else {
            echo "保存數據失敗!";
        }
    }
}
?>

模型層定義

ContentModel.class.php - 留言模型(含自動驗證/填充)

<?php
class ContentModel extends Model {
    protected $_validate = array(
        array('title',   'require', '標題必須填寫!'),
        array('content', 'require', '內容必須填寫!'),
    );
    protected $_auto = array(
        array('addtime', 'time', 1, 'function'), // 寫入時自動填充當前時間戳
    );
}
?>

UserModel.class.php - 用戶模型(唯一性驗證)

<?php
class UserModel extends Model {
    protected $_validate = array(
        array('username', '', '帳號名稱已經存在!', 0, 'unique', 1),
    );
}
?>

關鍵技術點總結

  • D() vs M():使用自動驗證時必須用 D("user") 實例化模型;M() 僅用於無模型類的表操作,無法觸發驗證。
  • 自動驗證規則:array(字段, 規則, 提示, 條件, 附加規則, 時間)
  • 自動填充:array(字段, 內容, 條件, 類型),如時間戳自動生成
  • Cookie 管理:登錄態維持 24 小時,登出時清除

成功/錯誤提示模板

<!DOCTYPE html>
<html><head>
<meta http-equiv="refresh" content="2; url='{$jumpUrl}'" />
<title>信息提示</title></head><body>
<div id="man_zone"><table width="40%" border="1" align="center" class="table">
<tr><th>信息提示</th></tr>
<tr><td><p>{$message}<br/>2秒後返回<a href="{$jumpUrl}">指定頁面</a></p></td></tr>
</table></div></body></html>

此示例展示了 ThinkPHP 早期版本(3.x 風格)的經典 MVC 開發模式,理解其核心機制對維護老專案或學習框架演進極有幫助。

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