在codeigniter中使用一对多保存一个产品的多个图像

时间:2017-04-05 03:46:17

标签: codeigniter foreign-keys

我是代码点火器的新手。 这是我想要做的。我有存储在数据库表名产品中的产品列表。对于每个产品,我需要插入多个图像。我创建了两个表,产品和产品图像。我已经将table productimage的product_id作为外键,引用了表产品的product_id。现在我想从表单中保存数据。这是我之前做过的Saving images in a single row by imploding 但是我很难管理CRUD(比如编辑和删除图片)。 所以我试图做上面提到的方式。我找不到开始的方法。任何人都可以请教我,我该如何开始?

好的,现在我在这里做了一些编码。这是我的控制者:

class BaseImageView(wx.BoxSizer):
    def __init__(self, project, panel, fps=5):
        .......    
        #blow line will give error
        self.bmp = wx.BitmapFromBuffer(width, height, self.removeBG(frame))
        self.image = statbmp.GenStaticBitmap(panel, wx.ID_ANY, self.bmp)
        self.Add(self.image)
        .......

    def removeBG(self, origFrame): 
        return  cv2.createBackgroundSubtractorMOG2().apply(origFrame)

这是我的模特:

    <?php
    defined('BASEPATH') OR exit('No direct script access allowed');

   class Products extends CI_Controller{

   public function __construct()
   {
  parent::__construct();
   $this->load->model('product_model');
   $this->load->helper(array('form','url'));
   //Codeigniter : Write Less Do More
   }

   public function index()
  {
   $data['products']=$this->product_model->get_product();
   $this->load->view('/landing_page',$data);
   }

   public function create()
   {
    #code
    $this->load->helper('form');
    $this->load->library('form_validation');
    $this->form_validation->set_rules('product_name','Product_Name','required');

   if($this->form_validation->run()=== FALSE)
   {
    $this->load->view('products/create');
   }
  else {
    $this->product_model->set_product();
    $data['products']=$this->product_model->get_product();
    redirect('/');
   }
 }
 }

Noe的情况是我的表单打开时我能够填写产品名称并上传图像文件。当我提交它时,它也不会抛出任何错误。但只有产品名称存储在产品表中,图像表没有任何反应。没有插入任何图像。浏览器不会抛出任何错误。只是图像 表是空的。这里的问题是什么?

3 个答案:

答案 0 :(得分:1)

让我帮你控制器..你需要检查所有上传的文件。他们是$ _FILES。循环遍历数组,将它们上传到服务器上,然后调用模型函数将它们添加到产品图像表

如果CI上传对您来说太棘手了。使用以下控制器功能

public function upload_images()
{
// following IF statement only checks if the user is logged in or not
if($this->session->userdata['id'] && $this->session->userdata['type']=='user')
{
    if($_FILES)
    {
        // check whether there are files uploaded / posted
        if(isset($_FILES['files'])){
            $data['errors']= array();
            $extensions = array("jpeg","jpg","png");

            //Loop through the uploaded files

            foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){

                $file_name = $key.$_FILES['files']['name'][$key];
                $file_size =$_FILES['files']['size'][$key];
                $file_tmp =$_FILES['files']['tmp_name'][$key];
                $i=1;
                if($file_size > 2097152){
                    $data['errors'][$i]='File '.$i.' size must be less than 2 MB';
                    $i++;
                }
                // Set upload destination directory
                $desired_dir="uploads";
                if(empty($data['errors'])==true){
                    if(is_dir($desired_dir)==false){
                        mkdir("$desired_dir", 0700);        // Create directory if it does not exist
                    }
                    if(is_dir("$desired_dir/".$file_name)==false){
                        // Upload the file. 
                        move_uploaded_file($file_tmp,"uploads/".$file_name);
                        // Call a function from model to save the name of the image in images table along with entity id
                        $this->post_model->addImage('property_images',$file_name,$this->uri->segment(3));
                    }else{                                  //rename the file if another one exist
                        $new_dir="uploads/".$file_name.time();
                        rename($file_tmp,$new_dir) ;
                    }
                }else{
                    $data['contact']=$this->admin_model->getContactDetails();
                    $data['images']=$this->post_model->getPropertyImages($this->uri->segment(3));
                    //load views
                }
            }
            if(empty($data['errors']))
            {
                redirect(base_url().'dashboard');
            }
            else
            {
                $data['contact']=$this->admin_model->getContactDetails();
                $data['images']=$this->post_model->getPropertyImages($this->uri->segment(3));
                //load views
            }
        }
    }
    else
    {
        //Load view
    }
}
else
{
    redirect(base_url().'user/login');
}

}

答案 1 :(得分:0)

如果有人遇到同样的问题,那么这里就是解决方案。只需在您的上传功能中执行此操作。(由我的朋友Amani Ben azzouz编写代码)

    public function set_product($id=0){
   $picture=array();
   $count=count($_FILES['picture']['name']);
   //Check whether user upload picture
   if(!empty($_FILES['picture']['name'])){
       foreach($_FILES as $value){
           for($s=0; $s<=$count-1; $s++){
               $_FILES['picture']['name']=$value['name'][$s];
               $_FILES['picture']['type']    = $value['type'][$s];
               $_FILES['picture']['tmp_name'] = $value['tmp_name'][$s];
               $_FILES['picture']['error']       = $value['error'][$s];
               $_FILES['picture']['size']    = $value['size'][$s];
               $config['upload_path'] = 'uploads/images/';
               $config['allowed_types'] = 'jpg|jpeg|png|gif';
               $config['file_name'] = $_FILES['picture']['name'];

               //Load upload library and initialize configuration
               $this->load->library('upload',$config);
               $this->upload->initialize($config);
               // print_r($value['name'][$s]);exit;
               if($this->upload->do_upload('picture')){
                   $uploadData = $this->upload->data();
                   $picture[] = $uploadData['file_name'];
               }
           }
       }
   }//end of first if
   $data=array('product_name'=>$this->input->post('product_name'));

   if ($id==0){
        $this->db->insert('products',$data);
        $last_id = $this->db->insert_id();
        if(!empty($picture)){
            foreach($picture as $p_index=>$p_value) {
               $this->db->insert('images', array('product_id'=>$last_id,'images'=>$p_value));
            }
        }
   }
   else {
       $this->db->where('id',$id);
       $this->db->update('products',$data);
       if(!empty($picture)){
           foreach($picture as $p_index=>$p_value) {
              $this->db->update('images', array('product_id'=>$last_id,'images'=>$p_value) ); // --> this one?
           }
       }
    }
  }

这也是用于插入和更新的。如果您只是想插入,只需删除传递的参数&#39; id&#39;切断if if和else部分写一个简单的内部代码&#39; if&#39;。

答案 2 :(得分:0)

function contract_upload(){ // function to call from your view. 
    $data = array();
    // If file upload form submitted
    if(!empty($_FILES['files']['name']) AND !empty('user_id')){
        $filesCount = count($_FILES['files']['name']);
        for($i = 0; $i < $filesCount; $i++){
            $_FILES['file']['name']     = $_FILES['files']['name'][$i];
            $_FILES['file']['type']     = $_FILES['files']['type'][$i];
            $_FILES['file']['tmp_name'] = $_FILES['files']['tmp_name'][$i];
            $_FILES['file']['error']    = $_FILES['files']['error'][$i];
            $_FILES['file']['size']     = $_FILES['files']['size'][$i];
            // File upload configuration
            $uploadPath = './uploads/contract/';
            $config['upload_path'] = $uploadPath;
            $config['allowed_types'] = 'jpg|jpeg|png|gif';
            $config['encrypt_name'] = TRUE;
            // Load and initialize upload library
            $this->load->library('upload', $config);
            $this->upload->initialize($config);
            // Upload file to server
            if($this->upload->do_upload('file')){
                // Uploaded file data
                $fileData = $this->upload->data();
                $uploadData[$i]['file_name'] = $fileData['file_name'];
                $uploadData[$i]['emp_id'] = $this->input->post('user_id');
            }
        }
        if(!empty($uploadData)){
            // Insert files data into the database
            $insert = $this->Contract_model->insert($uploadData);
            // Upload status message
            $statusMsg = $insert?'Files uploaded successfully.':'Some problem occurred, please try again.';
            $this->session->set_flashdata('messageactive', $statusMsg);
        }
    }
    redirect('contract'); // redirect link, where do you want to redirect after successful uploading of the file.
}
// Model Function
public function insert($data = array()){
    $insert = $this->db->insert_batch('employee_contract_files', $data); // table name and the data you want to insert into database.
    return $insert?true:false;
}

请记住一件事,您应该按照以下方式编写HTML:

<input type="file" name="files[]"  multiple />