我目前正在开展Codeigniter项目。到目前为止,我已经完成了用户注册和登录系统。但我似乎无法掌握每个用户如何发布内容的逻辑(例如:发布产品)。
我也有适当的产品上传系统(连接到数据库),在您登录帐户后立即加载。但是如何将其与当前登录的用户连接?
如果有必要发布一些代码来回答这个问题,我会这样做。
如果有人能够解释这样做背后的逻辑,那就太好了。
登录模型:
public function login(){
$this->db->where('user_handle', $this->input->post('full_name'));
$this->db->where('user_pass', sha1($this->input->post('password')));
$query = $this->db->get('reg_users');
if($query->num_rows() == 1){
return true;
} else {
return false;
}
}
产品输入模型:
public function productupload($data){
$this->db->insert('product_info', $data);
}
产品输入控制器:
public function uploadBook(){
$this->form_validation->set_rules('product_name', 'Product Name', 'required|trim|xss_clean');
$this->form_validation->set_rules('product_details', 'Product Details', 'required|trim|xss_clean');
$this->form_validation->set_rules('contact', 'Contact', 'required|trim|xss_clean|numeric|integer');
$data = array(
'product_name'=> $this->input->post('product_name'),
'product_details'=> $this->input->post('product_details'),
'contact'=> $this->input->post('contact')
);
if ($this->form_validation->run() == TRUE){
$this->model_productentry->productupload($data);
} else{
$this->load->view('uploads/view_upload');
}
}
正如您在Controller和产品条目模型中所看到的,没有提到应该将上传分配给哪个用户。这就是我无法搞清楚的事情。
答案 0 :(得分:1)
不要把它当作个人,但你认为你可能还没有为电子商务项目做好准备吗?
如果这个项目是针对其他人的,那么他们显然已经信任您的编码技能,并且您对这种信任负责,电子商务项目的安全性非常重要。
根据您的问题,您可能还不了解会话?并且您的login
函数只检查用户是否存在(不记录)
您在电子商务项目中使用sha1($this->input->post('password'))
保存用户密码......这是不可接受的(如果您不愿意,请做一些关于如何安全存储密码的研究我想使用身份验证库)
它不仅仅是PHP方面,对于数据库性能,你需要在这方面进行一些优化
所以也许只是在开始之前的1-2个月练习和阅读(关于PHP安全性,会话,数据库管理等...)?
我在你的代码中也看到了非常好的东西,你总是使用CodeIgniter函数,例如$ this-> db-> insert()它可以逃避所有查询并且是安全的,这意味着你已经正确阅读了用户指南完全
您还可以在执行任何操作之前验证所有用户输入,这也非常好
但如果这是个人项目而您现在必须这样做,请先使用CodeIgniter Authentication
库,例如Ion Auth或Tank Auth等等。
这些库为注册/登录/密码重置/记住我等提供了安全的方式......
然后,当用户使用auth库登录时,您可以在模型中执行此操作:
public function productupload(){
// Get User ID from session if it exists (session is set by auth library)
$user_id = $this->session->userdata('user_id');
if ($user_id === FALSE)
{
// Set flash data error that user should be logged in
redirect('login'); // redirect to login page
// Note that CodeIgniter redirect() function does exit() automatically, if you use PHP redirect you should exit manually right after that!, so always use CodeIgniter functions, but also know the reasons.
}
$data = array(
// Added user_id to $data, so you know which user has inserted this (also add this column in database)
'user_id'=> $user_id,
'product_name'=> $this->input->post('product_name'),
'product_details'=> $this->input->post('product_details'),
'contact'=> $this->input->post('contact')
);
$query = $this->db->insert('product_info', $data);
if ($query !== FALSE && $this->db->affected_rows() > 0)
{
// Flash data to tell user process was valid
$this->session->set_flashdata('message', 'Yeay, Success...');
// Always redirect after processing a form
redirect('controller_name');
}
// Maybe set error message?
// If query failed or not inserted return false
return FALSE;
}
您可能还想检查您的模型是否允许会话中的用户ID上传或有限制,或者如果每个产品都应输入一次,请检查它是否已存在查询或数据库UNIQUE KEY以避免重复
此外,由于这是一个电子商务项目,您可能也应该更改CodeIgniter配置,例如
$config['encryption_key'] = '32_CHARACTER_ENCRYPTION_KEY' // Get a CodeIgniter Encryption Key from http://randomkeygen.com if you don't know how to set it
$config['sess_expire_on_close'] = TRUE;
$config['sess_encrypt_cookie'] = TRUE;
$config['sess_use_database'] = TRUE; // If you enable this, you need to create a table in database (default table name is ci_session)
$config['sess_match_ip'] = TRUE;
$config['cookie_secure'] = TRUE;
$config['global_xss_filtering'] = TRUE; // So you won't forget to filter something
$config['csrf_protection'] = TRUE; // protect forms against csrf
我建议更改配置中的所有Cookie和令牌名称。
This was just a suggestion (and my personal idea) to let you know you have to make some changes and additional checks for such project, many additional checks/protections might be required depending on the project requirements