使用Codeigniter发布基于用户的内容

时间:2015-05-18 05:59:53

标签: php codeigniter

我目前正在开展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和产品条目模型中所看到的,没有提到应该将上传分配给哪个用户。这就是我无法搞清楚的事情。

1 个答案:

答案 0 :(得分:1)

不要把它当作个人,但你认为你可能还没有为电子商务项目做好准备吗?

如果这个项目是针对其他人的,那么他们显然已经信任您的编码技能,并且您对这种信任负责,电子商务项目的安全性非常重要。

  1. 根据您的问题,您可能还不了解会话?并且您的login函数只检查用户是否存在(不记录)

  2. 您在电子商务项目中使用sha1($this->input->post('password'))保存用户密码......这是不可接受的(如果您不愿意,请做一些关于如何安全存储密码的研究我想使用身份验证库)

  3. 它不仅仅是PHP方面,对于数据库性能,你需要在这方面进行一些优化

  4. 所以也许只是在开始之前的1-2个月练习和阅读(关于PHP安全性,会话,数据库管理等...)?

      

    我在你的代码中也看到了非常好的东西,你总是使用CodeIgniter函数,例如$ this-> db-> insert()它可以逃避所有查询并且是安全的,这意味着你已经正确阅读了用户指南完全

         

    您还可以在执行任何操作之前验证所有用户输入,这也非常好

    但如果这是个人项目而您现在必须这样做,请先使用CodeIgniter Authentication库,例如Ion AuthTank 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