如何在不覆盖 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 存储在会话中,或在创建新用户时实例化的用户对象中,但这更取决于用例。
我希望你过得很好。有人可以帮我解决我的问题吗?我有 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 存储在会话中,或在创建新用户时实例化的用户对象中,但这更取决于用例。