在 Model 層聲明驗證規則,控制器調用 verify() 自動校驗,失敗返回錯誤信息,通過則執行入庫。實現「規則集中、邏輯解耦、防注入/XSS」。
<?php
class MemberModel extends AppModel {
protected $tableName = "members";
protected $verify = array(
array("NotEmpty", "username", "用戶名不能留空"),
array("hasOne", "username", "此用戶已經存在"),
array("NotEmpty", "password", "密碼不能留空"),
array("NotEmpty", "email", "郵箱地址不能留空"),
array("isEmail", "email", "郵箱格式不正確"),
array("hasOne", "email", "郵箱已被占用")
);
public function create($data) {
$data = array_map("addslashes", $data); // 轉義
$data["password"] = md5($data["password"]); // 加密
return parent::create($data);
}
}
?>
private function PostData() {
$fields = array("username", "password", "email");
$post = array_map("trims", $_POST); // 去首尾空格
$post = parseHTML($post, $fields); // 清理 HTML 標簽
$data = parseFields($post, $fields); // 白名單過濾字段
$DB = & M("member");
if (!$DB->verify($data)) { // 自動校驗
$this->assign("error", $DB->getVerifyError());
$this->assign("default", $post); // 回填表單
$this->display("/register.html");
} else {
$result = $DB->create($data);
if (is_bool($result)) { // 入庫失敗
$this->assign("default", $post);
$this->display("/register.html");
} else { // 成功
$this->assign("username", $data["username"]);
$this->display("/reg_success.html");
}
}
}
| 規則 | 說明 |
|---|---|
| NotEmpty | 字段非空 |
| Number | 必須為整數 |
| isEmail | 郵箱格式合法 |
| hasOne | 值唯一(數據庫無重復) |
| Regex | 自定義正則,格式:array("Regex", "field", "/pattern/", "msg") |
if/elseLaravel FormRequest、Symfony Validator、ThinkPHP Validate 均採用類似思想,支持更豐富規則(唯一、存在、大小、文件類型等)與自定義消息翻譯。