CodeIgniter 3表单提交时下拉选择框必填错误不显示求助
问题描述
我跟着YouTube教程制作CodeIgniter高校管理系统,在WAMP服务器上提交表单时遇到问题:空表单提交时,gender和role_id这两个下拉选择框的必填验证错误无法显示。已检查表单输入的name属性与数据库表字段匹配,但问题仍存在。
控制器代码(welcome.php)
defined('BASEPATH') OR exit('No direct script access allowed'); class Welcome extends CI_Controller { /** * Index Page for this controller. * * Maps to the following URL * http://example.com/index.php/welcome * - or - * http://example.com/index.php/welcome/index * - or - * Since this controller is set as the default controller in * config/routes.php, it's displayed at http://example.com/ * * So any other public methods not prefixed with an underscore will * map to /index.php/welcome/<method_name> * @see https://codeigniter.com/user_guide/general/urls.html */ public function index() { //$this->load->helper('url'); $this->load->view('home'); } public function adminRegister() { $this->load->model('queries'); $roles = $this->queries->getRoles(); // print_r($roles); // exit(); $this->load->view('register',['roles'=>$roles]); } public function adminLogin() { echo 'Login'; } public function adminSignup() { //echo 'Registered succesfully'; $this->form_validation->set_rules('username','Username','required'); $this->form_validation->set_rules('email','Email','required'); $this->form_validation->set_rules('gender','Gender','required'); $this->form_validation->set_rules('role_id','Role','required'); $this->form_validation->set_rules('password','Password','required'); $this->form_validation->set_rules('confpwd','Password Again','required'); $this->form_validation->set_error_delimiters('<div class="text-danger">','</div>'); if($this->form_validation->run()){ echo 'validation passed'; }else{ //echo 'validation error'; echo validation_errors(); } } }
视图代码(register.php)
<?php include('inc/header.php');?> <div class="container mt-2"> <?php echo form_open('welcome/adminSignup',['class'=>'form-hoizontal']);?> <h3 class="text-center display-4">ADMIN REGISTER</h3> <hr/> <div class="row"> <div class="col-md-6"> <div class="form-group"> <div class="row"> <div class="col-md-3"> <label for="username" class="mt-2">User name:</label> </div> <div class="col-md-9"> <!-- <input type="text" class="form-control" placeholder="User name" id="username"> --> <?php $data = array( 'type' => 'text', 'name' => 'username', 'placeholder' => 'Enter Username', 'class' => 'form-control' ); echo form_input($data); ?> </div> </div> </div> </div> <div class="col-md-6"> <?php echo form_error('username','<div class="text-danger">','</div>');?> </div> </div><!--row--> <div class="row"> <div class="col-md-6"> <div class="form-group"> <div class="row mt-3"> <div class="col-md-3"> <label for="email" class="mt-2">Email address:</label> </div> <div class="col-md-9"> <!-- <input type="email" class="form-control" placeholder="Enter email" id="email"> --> <?php $data = array( 'type' => 'email', 'name' => 'email', 'placeholder' => 'Enter Email', 'class' => 'form-control' ); echo form_input($data); ?> </div> </div> </div> </div> <div class="col-md-6"> <?php echo form_error('email','<div class="text-danger">','</div>');?> </div> </div><!--row--> <div class="row"> <div class="col-md-6"> <div class="form-group"> <div class="row mt-3"> <div class="col-md-3"> <label for="gender" class="mt-2">Gender:</label> </div> <div class="col-md-9"> <!-- <input type="email" class="form-control" placeholder="Enter email" id="email"> --> <select class="form-control" name="gender"> <option>Select</option> <option>Male</option> <option>Female</option> </select> </div> </div> </div> </div> <div class="col-md-6"> <?php echo form_error('gender','<div class="text-danger">','</div>');?> </div> </div><!--row--> <div class="row"> <div class="col-md-6"> <div class="form-group"> <div class="row mt-3"> <div class="col-md-3"> <label for="email" class="mt-2">Role:</label> </div> <div class="col-md-9"> <select class="form-control" name="role_id"> <option>Select</option> <?php if(count($roles)) { ?> <?php foreach ($roles as $role){?> <option><?php echo $role->rolename;?></option> <?php } } ?> </select> </div> </div> </div> </div> <div class="col-md-6"> <?php echo form_error('role_id','<div class="text-danger">','</div>');?> </div> </div><!--row--> <div class="row"> <div class="col-md-6"> <div class="form-group"> <div class="row mt-3"> <div class="col-md-3"> <label for="password" class="mt-2">Password:</label> </div> <div class="col-md-9"> <!-- <input type="password" class="form-control" placeholder="Enter password" id="password"> --> <?php $data = array( 'type' => 'password', 'name' => 'password', 'placeholder' => 'Enter Password', 'class' => 'form-control' ); echo form_input($data); ?> </div> </div> </div> </div> <div class="col-md-6"> <?php echo form_error('password','<div class="text-danger">','</div>');?> </div> </div><!--row--> <div class="row"> <div class="col-md-6"> <div class="form-group"> <div class="row mt-3"> <div class="col-md-3"> <label for="password" class="mt-2">Password Again:</label> </div> <div class="col-md-9"> <!-- <input type="password" class="form-control" placeholder="Enter password" id="password"> --> <?php $data = array( 'type' => 'password', 'name' => 'confpwd', 'placeholder' => 'Enter Password Again', 'class' => 'form-control' ); echo form_input($data); ?> </div> </div> </div> </div> <div class="col-md-6"> <?php echo form_error('confpwd','<div class="text-danger">','</div>');?> </div> </div><!--row--> <div class="row"> <div class="col-md-6"> <!-- <button type="submit" class="btn btn-dark float-right">Register</button> --> <div class="float-right"> <?php echo form_submit('Register', 'Register',"class='btn btn-dark'"); ?> <?php echo anchor('welcome','GO BACK',['class'=>'btn btn-warning']);?> </div> </div> </div> <?php echo form_close(); ?> </div> <?php include('inc/footer.php');?>
解决方案
问题根源在于下拉选择框的默认选项:默认的<option>Select</option>会提交文本内容Select,CodeIgniter的required规则会判定该字段已有值,因此不会触发验证错误。
修改步骤:
- 修改gender下拉框:给默认选项添加
value="",未选择时提交空值:
<select class="form-control" name="gender"> <option value="">Select</option> <option>Male</option> <option>Female</option> </select>
- 修改role_id下拉框:同样给默认选项添加
value="":
<select class="form-control" name="role_id"> <option value="">Select</option> <?php if(count($roles)) { ?> <?php foreach ($roles as $role){?> <option><?php echo $role->rolename;?></option> <?php } } ?> </select>
- 可选优化:如果
role_id需要提交角色ID而非名称,需修改选项的value属性关联角色ID字段(如$role->id):
<option value="<?php echo $role->id;?>"><?php echo $role->rolename;?></option>
修改后,未选择下拉框选项提交表单时,gender和role_id字段值为空,required验证规则会生效并显示错误提示。
内容的提问来源于stack exchange,提问作者Sash_007
相关产品推荐
相关产品推荐

