Codeigniter:如何使用表单验证正确重定向

时间:2010-01-04 16:37:42

标签: codeigniter

我理解如何使用没有现有值的简单形式来做,但是假设我有一个可以通过http://domain.com/account/settings调用的视图。假设我有两个字段,用户名,密码和城市,都是从数据库中提取的(当然除了密码)。因此,如果用户尝试提交表单并因任何原因未通过验证,我应该将它们“重定向”到哪里?现在,我让它显示相同的视图,但问题是,它再次从数据库中提取信息。我应该创建两个不同的视图吗?

第二个视图基本上会显示他们尝试输入的错误信息。

5 个答案:

答案 0 :(得分:4)

您不需要两个单独的视图。查看Form Helper's个函数set_value()set_select()set_checkbox()set_radio()。这些在提交和验证后重新填充。因此,在您的情况下,您应该以这种方式指定字段:

<input type="text"
       name="username"
       value="<?php echo set_value('username', $user['username']); ?>" />
<input type="text"
       name="city"
       value="<?php echo set_value('city', $user['city']); ?>" />

默认情况下,输入的值为$user['city']。但在验证失败后,它将重新填充先前输入的值(包括不正确的值)。

请记住,您要重新填充的所有字段都需要通过form_validation库传递:

$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('city', 'City', '');

答案 1 :(得分:2)

在同一个控制器上你可以有这样的东西:

    if ($this->form_validation->run('create_comment') === TRUE)
    {
        $this->comments_model->name     = $this->input->post('name', TRUE);
        $this->comments_model->email    = $this->input->post('email', TRUE);
        $this->comments_model->website  = $this->input->post('website', TRUE);
        $this->comments_model->comment  = $this->input->post('comment', TRUE);
        $this->comments_model->create_comment();
                    redirect(current_url());
    }

    $this->load->view('your_view');

这就是它的全部内容。

这个想法是让它重定向到自己或者你想要的任何地方,当验证返回'true'时,我们会刷新页面,因此,更新页面。

如果验证返回'false',那么您将不必做任何事情。

答案 2 :(得分:1)

重定向到相同的表单。

并在您的视图中向访问者提供错误信息。

有两种方法可以做到这一点。

  1. 在视图中使用此错误。这将显示验证错误信息。

    echo validation_errors('&lt; p class =“error”&gt;','&lt; / p&gt;');

  2. 或者您可以使用flashdata()

  3. 在您的控制器中

    ...
    ...
     $this->session->set_flashdata('msg', 'All fields are required. or other useful info here. Please try again!');
    redirect('yourcontroller');
    

    在您看来,您需要展示它。

    <?php
    if ($this->session->flashdata('msg')){ //change!
        echo "<div class='message'>";
        echo $this->session->flashdata('msg');
        echo "</div>";
    }
    ?>
    

答案 3 :(得分:1)

遇到同样的问题并发现重定向会让您丢失form_error(...)或validation_errors()提供的数据,除非您将这些数据存储在会话中或传入数组中的数据中。加载视图。

要注意的一点是,只有当您想传递的数据在会话中时才应重定向,否则您应该只加载视图。后者确保在到达加载的视图时,您的验证错误完好无损。

答案 4 :(得分:0)

如果表单验证失败,只需加载相同的视图

控制器

$userData=array(
'username'=NULL,
'password'=NULL
);
#set form validation rules
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
#get all posted data ,this helps you in two ways,
# 1. Get all form data and can be use here server side
# 2. repopulating the form data by passing to view page
 $userData=$this->input->post(NULL, TRUE);
 #check form validation result
 if ($this->form_validation->run() == TRUE) {
 //do the operation 
 redirect(URL);

}else{
   $this->load->view($view, $userData);
}

查看页面

<form method=post action='URL'>
<input type='text' name='username'value='<?php echo $username?>'/>
<?php echo (form_error('username')) ? form_error('username', "<div style='color:red'>", "</div>") : ""; ?>
<input type='text' name='password' value='<?php echo $password?>'/>
<?php echo (form_error('username')) ? form_error('username', "<div style='color:red'>", "</div>") : ""; ?>
<input type='submit' value='submit'/>
</form>

此代码显示表单错误并重新填充表单