視圖:表單結構
<?= form_open('user/register', ['class' => 'form-horizontal', 'id' => 'regForm']) ?>
<?= validation_errors('', '
') ?>
<div class="form-group">
<label>用戶名</label>
<input type="text" name="username" class="form-control" value="<?= set_value('username') ?>">
<?= form_error('username', '', '') ?>
</div>
<div class="form-group">
<label>郵箱</label>
<input type="email" name="email" class="form-control" value="<?= set_value('email') ?>">
<?= form_error('email', '', '') ?>
</div>
<div class="form-group">
<label>密碼</label>
<input type="password" name="password" class="form-control">
<?= form_error('password', '', '') ?>
</div>
<div class="form-group">
<label>確認密碼</label>
<input type="password" name="passconf" class="form-control">
<?= form_error('passconf', '', '') ?>
</div>
<button type="submit" class="btn btn-primary">註冊</button>
</form>
控制器:驗證邏輯
public function register() {
$this->load->library('form_validation');
$this->load->helper(['form', 'url']);
// 1. 設置規則(推薦數組批量設置)
$config = [
[
'field' => 'username',
'label' => '用戶名',
'rules' => 'trim|required|min_length[3]|max_length[20]|alpha_numeric|is_unique[users.username]'
],
[
'field' => 'email',
'label' => '郵箱',
'rules' => 'trim|required|valid_email|is_unique[users.email]'
],
[
'field' => 'password',
'label' => '密碼',
'rules' => 'trim|required|min_length[8]|max_length[72]'
],
[
'field' => 'passconf',
'label' => '確認密碼',
'rules' => 'trim|required|matches[password]'
],
];
$this->form_validation->set_rules($config);
// 2. 自定義錯誤消息
$this->form_validation->set_message('is_unique', '{field} 已被註冊');
$this->form_validation->set_message('matches', '{field} 與 {param} 不一致');
// 3. 自定義錯誤定界符(全局)
$this->form_validation->set_error_delimiters('', '');
// 4. 運行驗證
if ($this->form_validation->run() === FALSE) {
$this->load->view('user/register');
return;
}
// 5. 驗證通過,業務處理
$data = [
'username' => $this->input->post('username', true),
'email' => $this->input->post('email', true),
'password' => password_hash($this->input->post('password'), PASSWORD_DEFAULT),
];
$this->User_model->register($data);
$this->session->set_flashdata('success', '註冊成功,請登錄');
redirect('user/login');
}
常用驗證規則速查
| 規則 | 說明 | 示例 |
| required | 非空 | required |
| min_length[n] | 最小長度 | min_length[6] |
| max_length[n] | 最大長度 | max_length[20] |
| exact_length[n] | 固定長度 | exact_length[11] |
| alpha | 僅字母 | alpha |
| alpha_numeric | 字母數字 | alpha_numeric |
| valid_email | 郵箱格式 | valid_email |
| valid_ip | IP 格式 | valid_ip |
| numeric | 純數字 | numeric |
| integer | 整數 | integer |
| decimal | 小數 | decimal |
| is_unique[table.col] | 數據庫唯一 | is_unique[users.email] |
| matches[field] | 與某字段匹配 | matches[password] |
| callback_func | 自定義回調 | callback_check_invitation |
自定義回調驗證
// 控制器中
$this->form_validation->set_rules('invite_code', '邀請碼', 'trim|required|callback_check_invite');
// 回調方法(必須 public,返回 bool)
public function check_invite($code) {
$valid = $this->Invite_model->verify($code);
if (!$valid) {
$this->form_validation->set_message('check_invite', '邀請碼無效或已過期');
return false;
}
return true;
}
最佳實踐建議
- 規則集提取到
application/config/form_validation.php 實現複用。
- 使用
set_value() 回填,配合 set_select()、set_checkbox()、set_radio() 處理下拉/複選/單選。
- 密碼字段驗證長度即可,不要 用
md5 等弱哈希規則,入庫時用 password_hash()。
- 生產環境關閉
debug,錯誤消息僅顯示用戶友好提示,詳細日誌寫入文件。
- 上一篇文章: PHP PDO 預處理語句完整指南:綁定參數、查詢、批量操作、異常處理
- 下一篇文章: CodeIgniter 使用 Composer 管理第三方依賴包完整流程
Copyright ©
程式碼之家 All Rights Reserved