【问题标题】:codeigniter pass variable from controller to modelcodeigniter 将变量从控制器传递到模型
【发布时间】:2013-03-03 10:46:16
【问题描述】:

我认为是简单的问题。

我的控制器正在使用 $this->uri->segment(3) 从 URL 中获取要显示的 if。这将始终是一个值。我把它放在一个数组中传递给模型:

$customerid = array(
   'id' => $this->uri->segment(3)
);

控制器语法如下:

function confirm_delete_customer()
{
            $data['title']="Confirm Customer Deletion";

            $customerid=array(
                'id'=>$this->uri->segment(3)
                );

            //query model to get data results for form
            $data=array();

            if($query=$this->model_master_data->get_customer_records_to_delete()){
                $data['records']=$query;


            $this->load->view("master_data/view_master_data_header",$data);
            $this->load->view("master_data/view_master_data_nav");
            $this->load->view("master_data/view_content_master_data_confirm_customer_deletion",$data);
            $this->load->view("master_data/view_master_data_footer");



}

然后我尝试访问此数组值并将其传递给我的模型进行处理。如果我将数组硬编码到模型中,它将按照以下语法工作:

模型 - 手动语法为:

function get_customer_records_to_delete()
{
    $query = $this->db->get_where('customers', array('id'=>43));
    return $query->result();
}

如果我尝试用我的控制器中的数组替换它,它会失败并出现错误: Undefined variable: customerid

我想要使用的模型的想法:

function get_customer_records_to_delete()
{
    $query = $this->db->get_where('customers', $customerid);
    return $query->result();
}

我有一种感觉,它很小。然而,这是从数据库中获取单个记录以输出到视图的最佳方式吗?

提前感谢您的帮助。

【问题讨论】:

    标签: codeigniter activerecord model controller


    【解决方案1】:

    最好的方法是:

    function confirm_delete_customer()
    {
        $data=array();
    
        $data['title']="Confirm Customer Deletion";
    
        $customerId = $this->uri->segment(3);
    
        //Prevent SQL injections
        if(!is_numeric($customerId) || empty($customerId)) {
            show_error("Bad Request");
        }
    
        $query = $this->model_master_data->get_customer_records_to_delete($customerId);
    
        if ($query){
            $data['records']=$query;
    
    
            $this->load->view("master_data/view_master_data_header",$data);
            $this->load->view("master_data/view_master_data_nav");
            $this->load->view("master_data/view_content_master_data_confirm_customer_deletion",$data);
            $this->load->view("master_data/view_master_data_footer");
    
        }
    }
    

    然后你可以简单地调用:

    function get_customer_records_to_delete($customerId)
    {
        $query = $this->db->get_where('customers', array('id'=>$customerId));
        return $query->result();
    }
    

    在你的模型上。

    【讨论】:

    • 谢谢约翰。这可行,但它是最佳实践吗?我认为控制器应该获取值并将其传递给模型而不是模型直接获取值?
    • 其次,这是用于返回单个记录的最佳代码 sn-p 吗?再次感谢约翰。
    • 答案是否定的,这不是最佳实践。我将使用最佳实践技术更新答案。
    • 太棒了,当我可以阅读它时,这很有意义,写它是另一个问题:-) 谢谢约翰,感谢你的时间。
    • 整个防止SQL注入部分是关于什么的?该模型使用自动转义数据的查询构建器。
    【解决方案2】:

    您需要将值作为参数传递给函数,以便它可以访问它。

    例如:

    get_customer_records_to_delete($customerid)
    {
        // now $customerid is accessible
        $query = ....;
        return $……;
    }
    

    【讨论】:

      【解决方案3】:

      您应该严重依赖函数参数。从控制器中获取客户 ID 并将其发送到模型。此外,您可以使用row() 从数据库中获取单个结果。

      控制器

          function confirm_delete_customer(){
          $data['title']="Confirm Customer Deletion";
      
          $customerid=$this->uri->segment(3);
      
      
          //query model to get data results for form
          $data=array();
      
          if($query=$this->model_master_data->get_customer_records_to_delete( $customerid)) //you are sending customer id as a parameter here
          $data['records']=$query;
      
      
          $this->load->view("master_data/view_master_data_header",$data);
          $this->load->view("master_data/view_master_data_nav");
          $this->load->view("master_data/view_content_master_data_confirm_customer_deletion",$data);
          $this->load->view("master_data/view_master_data_footer");
      
      
      
      }}
      

      型号

      function get_customer_records_to_delete($customerid) 
      {
          $query = $this->db->get_where('customers', array("id"=>$customerid)); //you are using the customer id sent from the controller here
          return $query->row(); //this will return a single row
      }
      

      【讨论】:

      • @Smudger 我知道我花了一点时间才回复 :D ...但无论如何欢迎 :)
      【解决方案4】:

      旧线程,但答案是在控制器中将变量声明为“公共”(即public $customerid;),在这种情况下,您的模型可以使用它。在某些情况下,明确地作为参数传递可能更安全。但是,当您有多个变量时,选择声明它们会很有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多