CodeIgniter表单错误需显示在输入框下方,提交跳转问题求助
我来帮你梳理下代码里的问题,你遇到的提交表单后跳转看不到错误信息的情况,主要是这几个地方出了问题:
1. 表单验证规则的拼写错误
你在控制器的form_validation->set_rules里,把**max_length**拼成了max_lenght(少了一个字母h),这个拼写错误会导致CI的表单验证规则完全失效,自然不会生成任何错误提示。所有规则里的max_lenght[20]都要改成max_length[20]。
另外,你给多个字段的规则标签都写的是USERNAME(比如密码字段的第二个参数),虽然不影响功能,但会导致错误提示里的字段名混乱,建议改成对应字段的名称,比如密码字段写成'Password',这样错误提示更准确。
2. 控制器里的输出语句干扰
在registercheck方法开头,你直接用echo输出了所有POST参数:
echo $this->input->POST('username'); echo $this->input->POST('pwd'); // ...其他echo语句
这些输出会在CI加载视图之前就被发送到浏览器,打乱页面的渲染结构,甚至导致错误信息无法正常显示。请把这些调试用的echo全部删掉。
3. 视图里的重复字段问题
你的register.php视图里重复了两次用户名输入框和错误提示:
<input type="text" class="form-control" id="username" name="username" value="<?php echo set_value('username'); ?>" > <?php if (form_error('username')) { ?> <span class="help-block"><?php echo form_error('username'); ?> </span> <?php } ?> <!-- 下面是重复的部分 --> <input type="text" class="form-control" id="username" name="username" value="<?php echo set_value('username'); ?>" > <?php if (form_error('username')) { ?> <span class="help-block"><?php echo form_error('username'); ?> </span> <?php } ?>
重复的字段会导致提交时username参数被覆盖,页面显示也混乱,删掉重复的那一段即可。
4. 验证失败时视图加载不完整
当表单验证失败时,你只加载了pages/register视图,而原来的view方法里是加载了header和footer模板的。这会导致页面缺少样式和布局,错误信息可能无法正常展示。应该改成和正常页面一样的加载方式:
if($this->form_validation->run() == false){ $this->load->view('template/header'); $this->load->view('pages/register'); $this->load->view('template/footer'); } else{ echo 'register ok'; }
修正后的关键代码示例
修正后的控制器registercheck方法
public function registercheck(){ $this->form_validation->set_rules('username', 'Username', 'required|max_length[20]'); $this->form_validation->set_rules('pwd', 'Password', 'required|max_length[20]'); $this->form_validation->set_rules('pwd2', 'Confirm Password', 'required|max_length[20]|matches[pwd]'); $this->form_validation->set_rules('fname', 'Full Name', 'required|max_length[20]'); $this->form_validation->set_rules('position', 'Position', 'required|max_length[20]'); $this->form_validation->set_rules('contactnumber', 'Contact Number', 'required|max_length[20]'); if($this->form_validation->run() == false){ $this->load->view('template/header'); $this->load->view('pages/register'); $this->load->view('template/footer'); } else{ echo 'register ok'; } }
(额外加了matches[pwd]规则给pwd2,确保两次密码一致,这个是注册表单常用的验证)
修正后的register.php视图片段
<form action="<?php echo base_url(); ?>pages/registercheck" method="post"> <input type="text" class="form-control" id="username" name="username" value="<?php echo set_value('username'); ?>" > <?php if (form_error('username')) { ?> <span class="help-block"><?php echo form_error('username'); ?></span> <?php } ?> <!-- 密码字段示例 --> <input type="password" class="form-control" id="pwd" name="pwd" > <?php if (form_error('pwd')) { ?> <span class="help-block"><?php echo form_error('pwd'); ?></span> <?php } ?> <!-- 确认密码字段示例 --> <input type="password" class="form-control" id="pwd2" name="pwd2" > <?php if (form_error('pwd2')) { ?> <span class="help-block"><?php echo form_error('pwd2'); ?></span> <?php } ?> <!-- 剩下的fname、position、contactnumber字段同理添加 --> <button type="submit">Register</button> </form>
修正这些问题后,当表单验证不通过时,页面会重新渲染注册页面,并且在对应的输入框下方显示错误信息,不会跳转到其他页面;验证通过后才会显示register ok。
内容的提问来源于stack exchange,提问作者Rjie

