# 存儲數據
數據的校驗已經完成,現在我們進行數據的存儲.
打開控制器 `application\user\controller\Auth.php` 并修改:
~~~~ php
use app\user\model\User;
...
if (true !== $result) {
return redirect('user/auth/create')->with('validate',$result);
} else {
return User::create($requestData);
}
~~~~
此時再重新提交數據,系統會拋出錯誤 `user` 表不存在,ThinkPHP 并未完全遵守前面章節所提到的約定俗稱標準,即 `UserModel` 對應 `users` 的約定,我們現在打開 `application\user\model\User.php` 并修改:
~~~~ php
class User extends Model
{
// 定義數據表名
protected $table = 'users';
}
~~~~
`protected $table` 方法,指定表名稱.
設置完成之后,再次提交,則會返回類似數據:
~~~~ text
{"__token__":"884e7770f55ac2d29964499b1ffabb0a35e8cf88","name":"1123","email":"agdholo@gmail.com","password":"protected $table = 'think_user';","password_confirm":"protected $table = 'think_user';","id":"1"}
~~~~
這表明我們的數據已經添加進數據庫,現在我們打開數據庫來查看,會發現 `updated_at` 字段并未自動維護,我們則需要手動設置維護字段
`config\database.php`:
~~~~ config
// 自動寫入時間戳字段
'auto_timestamp' => 'timestamp',
~~~~
`application\user\model\User.php`:
~~~~ php
// 定義數據表名
protected $table = 'users';
// 定義時間戳字段名
protected $createTime = 'created_at';
protected $updateTime = 'updated_at';
~~~~
現在重新添加提交數據,我們的字段已經自動由框架進行維護了.
可是現在的密碼還是明文提交的,我們需要在控制器中對密碼進行加密 `application\user\model\User.php`:
~~~~ php
// 設置修改器
public function setPasswordAttr($value)
{
return password_hash($value, PASSWORD_DEFAULT);
}
~~~~
這段代碼使用了 `ThinkPHP Model` 提供的修改器功能, `setPasswordAttr($value)` 可以拆分為 `set|Password|Attr`,中部的 `Password` 就是我們要設置的字段值,同樣的,如果我們要設置 `name` 字段就寫入 `setnameAttr` 就可以了.
`password_hash` 是 PHP 語言內置的一個 `非對稱加密` 算法: http://php.net/manual/zh/function.password-hash.php, 此加密算法不可逆向,只能通過驗證取得,請注意,在任何時候都不要使用 `md5` 極其一類的 `摘要算法`,它們屬于 `摘要算法` 而不屬于 `加密算法`,不可用做加密功能,為了您的生命安全,請牢記此項.
同樣的,我們只對郵箱做出了 `是否符合郵箱地址規則` 的校驗,并沒有篩選大小寫, `application\user\model\User.php`:
~~~~ php
// 設置修改器
public function setPasswordAttr($value)
{
return password_hash($value, PASSWORD_DEFAULT);
}
public function setEmailAttr($value)
{
return strtolower($value);
}
~~~~
現在傳入的 `email` 字段也會自動轉化為小寫,對提交的數據已經轉換完成了,這時候千萬不要已經收工,一個潛在的安全漏洞已經出現
在控制器 `application\user\controller\Auth.php` 中,我們通過 `User::create($requestData);` 來批量提交所有的字段,在數據表中我們有一項 `god` 字段,目的是判斷是否是超級管理員,如果這時候在前端偽造一個 `god` 字段進行提交,后果不堪設想,所以我們在入庫的時候需要進行字段過濾.
`application\user\model\User.php`:
~~~~ php
// 定義運行操作的字段
protected $field = ['name', 'email', 'password', 'avatar'];
~~~~
允許用戶自主提交的字段就不存在 `god` 等能夠手動提權的操作了.
## 跳轉至成功頁面
前面的數據操作都進行完成之后,我們還剩最后一項跳轉的任務, `application\user\controller\Auth.php`:
~~~~ php
public function save(Request $request)
{
$requestData = $request->post();
$result = $this->validate($requestData, 'app\user\validate\Auth');
if (true !== $result) {
return redirect('user/auth/create')->with('validate',$result);
} else {
$user = User::create($requestData);
return redirect('user/auth/read')->params(['id' => $user->id]);
}
}
~~~~
`redirect('user/auth/read')->params(['id' => $user->id])` 中 `params(['id' => $user->id])` 是傳遞的參數,當路由的 `read` 等操作綁定的是 `$id` 時,我們傳入 `$id` 將會自動跳轉到 `user/auth/read/$id`.
可是現在跳轉過去的頁面任然是空白,所以我們需要添加一些操作 `application\user\controller\Auth.php`:
~~~~ php
public function read($id)
{
$user = User::find($id);
$this->assign('user', $user);
return $this->fetch();
}
~~~~
`User::find($id)` 是模型的一個查詢語法,默認查詢 `$id(主鍵值)`.
接著創建前端文件 `resources\views\user\auth\read.blade.php`:
~~~~ html
@extends('_layout.default')
@section('title', $user->name)
@section('content')
<div class="col-md-offset-2 col-md-8">
<div class="panel panel-default mt-5">
<div class="panel-heading mb-3">
<h4>歡迎您 {{ $user->name }}</h4>
</div>
</div>
</div>
@stop
~~~~
現在重新注冊個用戶,即可自動跳轉至歡迎頁面了.
- 第一章. 基礎信息
- 1.1 序言
- 1.2 關于作者
- 1.3 本書源碼
- 1.4 反饋糾錯
- 1.5 安全指南
- 1.6 捐助作者
- 第二章. 開發環境布置
- 2.1 編輯器選用
- 2.2 命令行工具
- 2.3 開發環境搭建
- 2.4 瀏覽器選擇
- 2.5 第一個應用
- 2.6 Git 工作流
- 第三章. 構建頁面
- 3.1 章節說明
- 3.2 靜態頁面
- 3.3 Think 命令
- 3.4 小結
- 第四章. 優化頁面
- 4.1 章節說明
- 4.2 樣式美化
- 4.3 局部視圖
- 4.4 路由鏈接
- 4.5 用戶注冊頁面
- 4.6 集中視圖
- 4.7 小結
- 第五章. 用戶模型
- 5.1 章節說明
- 5.2 數據庫遷移
- 5.3 查看數據表
- 5.4 模型文件
- 5.5 小結
- 第六章. 用戶注冊
- 6.1 章節說明
- 6.2 注冊表單
- 6.3 用戶數據驗證
- 6.4 注冊失敗錯誤信息
- 6.5 注冊成功
- 6.6 小結
- 第七章. 會話管理
- 7.1 章節說明
- 7.2 會話
- 7.3 用戶登錄
- 7.4 退出
- 7.5 小結
- 第八章. 用戶 CRUD
- 8.1 章節說明
- 8.2 重構代碼
- 8.3 更新用戶
- 8.4 權限系統
- 8.5 列出所有用戶
- 8.6 刪除用戶
- 8.7 訪客模式
- 8.8 優化前端
- 8.9 小結
- 第九章. 微博 CRUD
- 9.1 章節說明
- 9.2 微博模型
- 9.3 顯示微博
- 9.4 發布微博
- 9.5 微博數據流
- 9.6 刪除微博
- 9.7 小結