如何在不覆盖 codeigniter 中的其他会话的情况下使用会话向外键插入值?

how to insert a value to a foreign key using session without overriding the other sessions in codeigniter?

我希望你过得很好。有人可以帮我解决我的问题吗?我有 2 tables。另一个是给客户的,它有一个customer_id的自动增量值。另一个 table 用于订单,它的 orders_id 和来自另一个 table (customers) 的外键也有一个自动增量。

当我插入新客户时,如果成功,我希望将页面重定向到添加新订单页面。在插入新订单时,我的 orders table 中的 customer_id 字段应该与新添加的客户具有相同的值。添加客户和添加新订单在我的控制器中具有不同的功能。我在插入新订单时出现错误 1452,这意味着在 orders table 中为外键 customers_id 插入的值与另一个 table 中的值不同](客户)。

现在,我使用会话得到了这个解决方案。我的问题是另一个获取最后一个 ID 的会话覆盖了登录会话。

这是我的控制器的一些代码片段:

Class MyController extends CI_Controller
{ 
 function __construct()
 {
  parent::__construct();
  $this->c_id = 0;
  if($this->session->userdata('logged_in'))
     {
      $session_data = $this->session->userdata('logged_in');
      $data['username'] = $session_data['username'];
   if($session_data['username'] == 'administrator'){
    $this->load->database('sample');
    $this->load->model('samplemodel_model');
    $this->load->library('form_validation');
   } else {
       redirect('home', 'refresh');
   }

  } else {
   redirect('login', 'refresh');
  }
 }
        public function index() {

  if($this->session->userdata('logged_in'))
     {
            $session_data = $this->session->userdata('logged_in');
      $data['username'] = $session_data['username'];

      //code for validation here

   $customers = $this->samplemodel_model->get_entries('customers');

      if($this->form_validation->run() == FALSE) {
       //Field validation failed.
      } else {
        //Insert $data
                //$data = array('xxxxxx'); 
                //data is something like that
    $this->create($data);
      }
     }
     else
     {
       //If there's no session it will redirect to login page
     }

 }

 //add new orders
 public function addOrders() {
  if($this->session->userdata('last_inserted_id')) //if I use this session, I can get the last inserted ID but the session data for the login will not be retrieved.
     {
      $session_data = $this->session->userdata('last_inserted_id');

   $orders = $this->samplemodel_model->get_entries('orders');

      if($this->form_validation->run() == FALSE) {
       //Field validation failed.
      } else {
        //Insert data

       $data = array('customer_id' => $session_data['customer_id'], 
            'order_type' => $this->input->post('order_type'));

    $this->createItem($data);
      }
     }
     else
     {
       //If no session, redirect to login page
       redirect('login', 'refresh');
     }
 }

 //create customer
 public function create($data) {
      //Insert data
  $customers = $this->samplemodel_model->get_entries('customers');

  //$data = array(xxxxx);
        //somethin' like that for data array

  $this->load->samplemodel_model->create('customers', $data);

  //***********************************************************//
  //                get and save last id inserted              //
  //***********************************************************//

   //query the database
     $result = $this->samplemodel_model->get_last_inserted($this->db->insert_id());
     if($result)
     {
      $sess_array = array();
       foreach($result as $row)
       {
          $sess_array = array('customer_id' => $row->customer_id);
          $this->session->set_userdata('last_inserted_id', $sess_array);
       }
       return TRUE;
     }
     else
     {
      echo "<script type='text/javascript'>alert('error');</script>";
      return false;
     }

     session_start('last_inserted_id');

     //********************************************************//
     //                          end                           //
     //********************************************************// 

  redirect('myController/addOrders', 'refresh');
       
 }
 public function createItem($data) {
  //Insert data
  $orders = $this->samplemodel_model->get_entries('orders');

  $data = array('customer_id' => $session_data['customer_id'],
       'order_type' => $this->input->post('order_type'));
   
  $this->load->samplemodel_model->create('orders', $data);

        //I'm not so sure if it is in this function that I should place the unset for the session 'last_inserted_id'

  redirect('home', 'refresh');
 }
}

并且在我的模型中,我插入了另一个函数来帮助我保存最后插入的 ID。在这里:

public function get_last_inserted($id)
 {
    $this -> db -> select('customer_id');
    $this -> db -> from('customers');
    $this -> db -> where('customer_id', $id);
    $this -> db -> limit(1);
  
    $query = $this -> db -> get();
  
    if($query -> num_rows() == 1)
    {
      return $query->result();
    }
    else
    {
      return false;
    }
 }

请放心!帮助 :'( 如果您有任何其他想法,我将不胜感激。非常感谢!

问题是您正在重定向,每个 HTTP 请求都是它自己的进程,有自己的变量,每个请求都无法访问其他请求中设置的变量。

尝试将客户 ID 作为参数传递给 addOrders(),然后您可以使用 codeigniter 方式传递参数:

http://www.example.com/controller/method/paramter

查看文档:

https://ellislab.com/codeigniter/user-guide/general/controllers.html

段下:将 URI 段传递给您的函数

其他可能的解决方案:将 customerID 存储在会话中,或在创建新用户时实例化的用户对象中,但这更取决于用例。