Codeigniter 表单发布和验证

Posted

技术标签:

【中文标题】Codeigniter 表单发布和验证【英文标题】:Codeigniter form post and validation 【发布时间】:2013-04-10 00:07:41 【问题描述】:

我不是专业人士,但我熟悉 php,我是 Codeigniter 的新手。

一直在学习这些教程:http://net.tutsplus.com/articles/news/codeigniter-from-scratch-day-5-crud/

好的,所以我有一个列出用户的页面,点击用户名将转到一个编辑页面,该页面的 url 是:index.php/users/edit/1(其中 1 是用户 ID)

在编辑页面上是一个表单,这个表单包含几个部分,每个部分都是从数据库中的不同表中填充的。所以我的编辑控制器如下:

function edit() 

        //load model
        $this->load->model('users_model');

        //assign user data from DB 
        $data['data_user'] = $this->users_model->getUser($this->uri->segment(3));
        //get users Password, using username from above
        $data['data_user_password']= $this->users_model->getUserPassword($data['data_user'][0]->UserName);

        $data['page_content'] = 'pages/users_edit';
        $this->load->view('template/template', $data);
    

注意: $data['data_user'] 包含用户数据,如姓名、用户名、电子邮件 $data['data_user_password'] 包含来自不同表的用户密码

然后我可以在 users_edit.php 上填充表单,这一切正常。 我通过执行以下操作来访问这些数据:

if (is_array($data_user)) 
    foreach($data_user as $user) 
    
        $userID         = $user->id;
        $userName       = $user->Name;
        $userUserName   = $user->UserName;
        $userMail       = $user->Mail;
        $userDepartment = $user->Department;
        $userWorkPhone  = $user->WorkPhone;
        $userHomePhone  = $user->HomePhone;
        $userMobile     = $user->Mobile;

    

//user password
if (is_array($data_user_password)) 
    foreach($data_user_password as $user) 
    
        $userPassword   = $user->value;
    


Name: 
<?php echo form_input('name', set_value('name', $userName), 'id="name" class="inputLong"'); ?>

当我发布时,我将数据发送到:index.php/users/update

到目前为止,我对该页面的控制器是:

function update() 

        echo '<pre>';
        print_r($_POST);
        echo '</pre>';
        //exit();

        $this->load->library('form_validation');

        $this->form_validation->set_rules('name', 'Name', 'trim|required');

        if ($this->form_validation->run() == FALSE)
        
            $this->load->view('pages/users_edit');
        
        else
        
            $this->index();
        

    

目前,我只是在表单 input=name id=name 的用户“名称”上测试验证

我认为我没有正确处理其中的 if ($this->form_validation->run() == FALSE) 部分,如果表单包含数据,它会传递并重定向到索引,如果我将名称留空它要么没有正确处理编辑页面,要么我不知道,有些事情不对。我认为这是因为页面正在使用 post 数组重新加载,而不是像我在函数 edit() 中那样传递 $data。

返回表单页面,它应该显示validation_errors,它的显示:

名称字段是必需的。

这是正确的,但是对于应该预填充的其余字段,它显示 PHP 错误:

A PHP Error was encountered

Severity: Notice

Message: Undefined variable: userUserName

Filename: pages/users_edit.php

Line Number: 50

【问题讨论】:

是的,表单页面加载如下: 请确保您已定义“serUserName”变量? $data_user 中,如果您收到一个用户的数据,则不要循环。 @Mark 你没有将任何变量发送到你的视图,所以你不能在那里访问它们。$data_user 不存在,所以它没有循环。 也就是说我的代码中的 if (is_array($data_user)) 部分在我看来是不正确的,应该是什么? 【参考方案1】:

您可以在编辑函数中进行验证,而不是使用更新函数,这样,您的数据仍然可供您查看,如果验证有错误,codeigniter 将负责重新填充您的字段。如果验证正常,请执行下一步

function edit() 

    //load model
    $this->load->model('users_model');

    //assign user data from DB 
    $data['data_user'] = $this->users_model->getUser($this->uri->segment(3));
    //get users Password, using username from above
    $data['data_user_password']= $this->users_model->getUserPassword($data['data_user'][0]->UserName);

    $data['page_content'] = 'pages/users_edit';
    $this->load->view('template/template', $data);

    //is the form submitted
    if(form submit)
         if ($this->form_validation->run() == TRUE)
         
             $this->index();
         
         else
         
         $this->load->view('pages/users_edit', $data);
         
    

【讨论】:

【参考方案2】:
$this->load->view('pages/users_edit');

在您的函数 update() 中,验证后您会加载视图,但不会将任何数据变量传递给它。所以你没有任何变量可以在你的视图文件中访问..

您必须以与函数 edit() 相同的方式设置变量:

$this->load->view('template/template', $data);

目前没有设置变量 $data_user 所以你不能循环使用它..

【讨论】:

我不明白,在视频教程和用户指南中:ellislab.com/codeigniter/user-guide/libraries/… 他们没有重新加载页面并将任何数据传递给它,在视频中他们说 Codeigniter 负责为你..??这意味着我需要在再次加载表单之前使用发布的数据重建 $data['data_user'] 和 $data['data_user_password'] 数组,对吗? 当你进入编辑页面时,你会加载 Controller -> EDIT() 函数和你的用户数据。当你提交表单时,你会被发送到 Controller -> UPDATE() 函数,用户数据所在的位置没有设置..所以你不能访问它:) ..

以上是关于Codeigniter 表单发布和验证的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter:如何构建使用表单验证和重新填充的编辑表单?

在 CodeIgniter 中验证表单下拉列表

CodeIgniter - AJAX 注册表单验证

codeigniter 表单验证和数组作为字段名称

将所有字段发布为数组的 Codeigniter 表单验证

在 Codeigniter 中填充表单数据和验证数据的更简单方法?