【问题标题】:A Complex Inputs Form in CodeIgniter - Data for Three TablesCodeIgniter 中的复杂输入表单 - 三个表的数据
【发布时间】:2013-04-22 23:51:51
【问题描述】:

我有以下三个表:

ADDRESSES
------------
// Usual Address Data Fields

People
-------------
// Usual Personal Info
AddressId - FK
RoleId - FK

Role
--------------
RoleId
Name

一个角色可以有很多人,每个人只能属于一个角色。至于地址,每个人都会链接到一个地址,每个地址只会分配给一个人。

所以,我想做的是注册一个人。注册表单必须收集所有三个表的数据并以不会使 MySQL 抛出错误的方式存储它们。

我的表单看起来不错,并且我在下拉列表中填充了角色。但我的问题是关于表单提交时到达的 POST 请求的处理。这是我的 POST 处理代码:

public function register()
{
    $this->load->library('form_validation');

    $this->form_validation->set_rules('FirstName', 'First Name', 'trim|required');
    $this->form_validation->set_rules('LastName', 'Last Name', 'trim|required');
    $this->form_validation->set_rules('Telephone', 'Telephone', 'trim|required');
    $this->form_validation->set_rules('Email', 'Email', 'trim|required|valid_email');
    $this->form_validation->set_rules('Password', 'Password', 'trim|required');
    $this->form_validation->set_rules('MaxNo', 'MaxNo', 'trim|required');
    $this->form_validation->set_rules('FirstLine', 'First Line', 'trim|required');
    $this->form_validation->set_rules('SecondLine', 'Second Line', 'trim');
    $this->form_validation->set_rules('City', 'City', 'trim|required');
    $this->form_validation->set_rules('PostCode', 'Post Code', 'trim|required');

    if($this->form_validation->run())
    {
        echo "Validation Failed";
        // something went wrong.
        $this->load->model('rolesmodel');
        $data['roles'] = $this->rolesmodel->getRolesForUserRegForm();
        $this->load->view('shared/header');
        $this->load->view('charity/register', $data);
        $this->load->view('shared/footer');
    } else {
        // All is Good

        $address = array(
            'FirstLine' => $this->input->post('FirstLine'),
            'SecondLine' => $this->input->post('SecondLine'),
            'City' => $this->input->post('City'),
            'PostCode' => $this->input->post('PostCode'),
        );

        $this->load->model('addresses_model');
        $addId = $this->addresses_model->getCurrentCountOfRows();

        $this->addresses_model->addNewsAddress($address);

         $person = array(
            'FirstName' => $this->input->post('FirstName'),
            'LastName' => $this->input->post('LastName'),
            'Telephone' => $this->input->post('Telephone'),
            'Email' => $this->input->post('Email'),
            'Password' => $this->input->post('Password'),
            'MaxNo' => $this->input->post('MaxNo'),
            'AddressId' => (int)$addId + 1,
            'RoleId' => $this->input->post('Name') // this is the Roles DropDown Name Property
        );

        $this->load->model('people_model');
        $this->people_model->registerPerson($person);
        redirect('/animals/index');
    }
}

我知道我必须先将地址保存到数据库中,但如果我这样做了,我怎样才能快速获取它的 ID?因为除非它首先保存到数据库中,否则它不会有 ID。

其次,如何处理角色下拉选择?

【问题讨论】:

  • 为什么要先输入地址??
  • 因为 Person 引用了地址。如果地址不在数据库中,则无法引用它.. 否?
  • 地址是用户输入的(我看到你的代码),对吧?
  • 是的,地址将由用户提供。这是looks like 的形式。

标签: php codeigniter post input


【解决方案1】:

要在插入后获取您的地址 ID,请让模型中的函数返回:

return $this->db->insert_id();

要获取您的下拉值,在您的视图中,您将有一个选择。大概是这样的:

<select name="roleId">....</select>

使用它在您的控制器中获取您的 roleId:

$person->RoleId = $this->input->post('roleId')

请注意,您在 post() 方法中输入的字符串必须与您的选择的“名称”属性一致

把你最后的代码改成这样:

$this->load->model('PeopleModel');
$this->load->model('AddressModel');
$person->AddressId = $this->AddressModel->insert($address);
$this->PeopleModel->register($person);

希望这会有所帮助,请不要犹豫,进一步提问 =)

【讨论】:

  • 感谢 ID @Crowlix。现在正要试一试。至于下拉,我知道如何填充,我只是不知道如何在 POST 方面处理它。 :)
  • 解决了这个问题,但仍然需要下拉菜单的帮助以及如何在控制器的 POST 处理函数中处理它
  • 谢谢,它让我更接近解决方案,然后我想通了。我需要角色 ID 而不是角色名称。所以我创建了一个新函数来从我的roles_model 上的名称中获取 ID。然后我这样称呼它(int)$this-&gt;roles_model-&gt;getRoleIdFromName($this-&gt;input-&gt;post('Name'))。现在一切正常:)
【解决方案2】:

我会这样做:(这必须是你的注册函数,只是伪代码)

 protected function getAddressId($param = array()){
    //save address data here and return it's id;     
 }

 public function register($param = array()){
   //1. grab address id
   $AdsressId = $this->getAddressId()
   //2. save person data + $AddressId + RoleId
   //3. All done
 }

【讨论】:

  • 这也是我最初的想法,但后来我想可能有更清洁的方法。
  • 我无法测试该代码,因为在我到达有趣的位之前验证失败。 :( 知道为什么它无法验证吗?我输入的所有内容都是正确的(我认为!)。验证错误消息也没有显示,即使我认为我有这个。&lt;?php validation_errors(); ?&gt;
  • 嗯.. 不知道,尝试激活 log_threshold 可能会有所帮助。
  • 验证失败,因为我正在这样做$this-&gt;form_validation-&gt;run() == FALSE!不需要等同于 false,因为语句已经返回布尔值。除了 DropDown 值之外,现在一切都在工作。我会尝试解决它。​​
  • :) 感谢告知。 Dropdown 值有什么问题?
猜你喜欢
  • 1970-01-01
  • 2018-03-14
  • 2014-12-27
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2018-12-06
  • 2016-03-17
  • 1970-01-01
相关资源
最近更新 更多