CodeIgniter - 如何在整个程序中使用对象变量

时间:2016-03-03 15:32:48

标签: php mysql codeigniter oop

MVC / Codeigniter的新手,仍然不完全理解所有概念。我希望我的问题有点清楚,但这就是我想要做的事情:

我的应用程序基本上是一个用户填写的多页表单,最后有一个他可以根据所有输入查看的报表。报告流程基本上就像这样

'Create New Report' -> 'fill customer info' -> 'fill user info' -> 'Enter Data' -> 'Preview Report'

上述所有步骤基本上都是视图,并具有相应的控制器和模型。

  1. 每次创建新报告时,我都会使用报告控制器在我的数据库中插入一个包含新报告ID的行:

    class Reports extends CI_Controller {
    
     public function index() {
      //list all current existing reports
    
    //model controller simple get to return all reports in db
    $data['results']  = $this->report_model->get_reports();
    
    $this->load->view('header');
    $this->load->view('reports_view', $data);
    $this->load->view('footer');
    
     }
    
    
     public function createReport() {
    //create new id for report when user initiates new report
    
    //Enter placeholders in reports db until further info recieved
    $data = array(
        'customer_id'   => 1,
        'user_id'       => 1,
        'data_id'       => 1
        );
    
    //will be done in model just temporarily in controller
    $this->db->insert('reports', $data);
    
      }
     }
    
  2. 选择'创建新报告'将带您进入填写客户信息'查看这是一个带有名称,联系人等的简单表单。客户控制器和模型将信息存储到客户数据库并为客户创建新的ID。

  3. 客户控制人:

    class Customer extends CI_Controller {
    
    public  $customerData;
    
    
    public function index() 
    {
    
        $this->load->view('header');
        $this->load->view('customer_view');
        $this->load->view('footer');
    
    }
    
    
     public function saveCustomerInfo() {
    
    
         $customerData = array(
    
        'customerName'       => $this->input->post('customer_name'),
        'customerPhone'      => $this->input->post('customer_phne'),
        'customerEmail'      => $this->input->post('customer_email'),
        'customerAddress'    => $this->input->post('customer_addr'),
        'customerCity'       => $this->input->post('customer_city'),
        'customerstate'      => $this->input->post('customer_state')
    
       );
    
            $output = $this->customer_model->save_customers($customerData);
     }
    }
    
    1. 我也对下两个视图做了同样的事情。
    2. 来自客户,用户和数据的所有信息都通过其他表格中的主键链接到我的报表表格,报表表格基本上就是这样。

      *---------------------------------------------------------*
      | report_id | (fk)customer_id | (fk)user_id | (fd)data_id |
      *---------------------------------------------------------*
      |   1       |     4           |      7      |     3       | 
      |   2       |     2           |      9      |     1       |
      |   3       |     1           |      1      |     6       |
      

      我想知道如何为正在进行的当前报告存储$ report_id,以便我可以将其传递给客户/用户/数据控制器,以便填写表格中的那些部分并将其写入数据库我可以更新报告表,并用最初的客户,用户和数据信息替换我最初的占位符。

      我不想为此起诉会议,所以这是最好的方法。可能是一个非常简单的答案,但我是一个新手,所以非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

在完成$this->db->insert(...);后的模型中,您可以获取最后一条记录的ID并返回该记录,基本上是return $this->db->insert_id();

如果您从控制器调用保存功能:

$report_id = $this->Reports_model->save(...);

您的型号代码

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

您的控制器将最后插入ID。然后,您可以通过执行以下操作将其传递给控制器​​:

$this->load->view('path/to/view', ['report_id' => $report_id]);

然后您可以在视图中使用变量$report_id,您可以将其添加到隐藏字段。

您还可以使用控制器中的$ report_id将其添加到会话中,以便人们无法检查HTML并篡改您的ID。

答案 1 :(得分:0)

我不知道您的确切要求,但这应该有效。 (这是 不安全 ,并且明显 错误 。但它确实有效) 生成report_id后,将其作为get参数传递给其余页面。例如:

假设已生成report_id 99,则访问create_pages的其余部分

fillCustomerForm/99
or
fillCustomerForm?report_id=99

通过这种方式,您可以跟踪当前信息所属的report_id(此参数也应传递给您的表单提交脚本,即saveCustomerInfo等)

正如我所说,假设用户没有更改网址,这将有效。但如果他这样做,你将不得不实施一些安全措施,在这种情况下将使用会话来完成。 所以无论如何你看它,你需要会议。

<强> TL;博士 长话短说,它可以做到。但不要。

PS:避免CI的内置会话,它们已经坏了。