Codeigniter Загрузить избранные изображения и несколько изображений одновременно - PullRequest
0 голосов
/ 28 мая 2018

Я изменил код для использования цикла foreach, теперь я могу получить доступ к именам файлов, а print_r печатает имена файлов в массиве так:

Array ( [0] => Uconn.png [1] => UW_Medicine.png [2] => Yale.png ) Axis.png

но япо-прежнему появляется следующая ошибка:

A PHP Error was encountered

Severity: Notice

Message: Array to string conversion

и ошибка базы данных:

Error Number: 1054

Unknown column 'Array' in 'field list'

INSERT INTO `yacht_slider` (`yacht_slide_id`, `slide`) VALUES (87, Array)

Я просто не знаю, как передать зацикленные файлы внутри модели для загрузки.

Я пытаюсь загрузить выбранное изображение на одном входе и несколько изображений на другом входе одновременно, я пробовал много способов и способов сделать это, но я всегда заканчиваю с ошибкой, в основном преобразованием массива в строкуошибка.

рекомендуемое изображение хранится в одной таблице базы данных, а несколько изображений хранятся в другой таблице.

Мой текущий код:

HTML:

<div class="form-group">
          <label for="" class="control-label">Image</label>
          <input type="file" class="form-control" name="featured">
        </div>
        <div class="form-group">
          <label for="" class="control-label">Slider</label>
          <input type="file" class="form-control" name="userfile[]" multiple>
        </div>

Модель:

public function create_yacht($yacht_img, $slider){
  $slug = url_title($this->input->post('title'));
  $data = array(
    'title' => $this->input->post('title'),
    'slug' => $slug,
    'img' => $yacht_img,
    'city' => $this->input->post('city'),
    'category' => $this->input->post('category'),
    'price' => $this->input->post('price'),
    'description' => $this->input->post('description')
  );
  $this->db->insert('yachts', $data);
  $insert_id = $this->db->insert_id();
  $data_4 = array(
    'yacht_slide_id' => $insert_id,
    'slide' => $slider
  );
  $this->db->insert('yacht_slider', $data_4);
}

Контроллер:

public function create_yacht(){
  $data['title'] = 'Create';
  $data['categories'] = $this->category_model->get_categories();
  $this->form_validation->set_rules('title', 'Title', 'required');
  $this->form_validation->set_rules('city', 'City', 'required');
  if($this->form_validation->run() === FALSE){
    $this->load->view('templates/admin_header');
    $this->load->view('admin/create_yacht', $data);
    $this->load->view('templates/admin_footer');
  }else{
    $config['upload_path'] = './assets/images';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size'] = '2048';
    $this->load->library('upload', $config);
    $featured = 'featured';
    if (!$this->upload->do_upload($featured)) {
      $errors = array('errors' => $this->upload->display_errors());
      $yacht_img = 'https://via.placeholder.com/1920x1080';
    }else{
      $data = array('upload_data' => $this->upload->data());
      $yacht_img = $_FILES['featured']['name'];
    }
    foreach ($_FILES['userfile']['name'] as $name) {
      $this->upload->initialize($config);
      $this->upload->do_upload($name);
      $data = array('upload_data' => $this->upload->data());
      $slider = $_FILES['userfile']['name'];
    }
    print_r($slider);
    print_r($yacht_img);
    $this->yacht_model->create_yacht($yacht_img, $slider);
    // redirect('admin');
  }
}

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Я немного почистил ваш код и добавил несколько отчетов об ошибках, чтобы пользователи не были озадачены при возникновении ошибки.

Контроллер:

public function create_yacht() {
        $data['title'] = 'Create';
        $data['categories'] = $this->category_model->get_categories();
        $this->form_validation->set_rules('title', 'Title', 'required');
        $this->form_validation->set_rules('city', 'City', 'required');
        if ($this->form_validation->run() === FALSE) {
            $this->load->view('templates/admin_header');
            $this->load->view('admin/create_yacht', $data);
            $this->load->view('templates/admin_footer');
        } else {
            $this->load->library('upload');
            $upload_path = './testupload/';
            // just in case, make path if it doesn't exist
            // if we can't die
            if (!is_dir($upload_path) && @mkdir($upload_path, DIR_WRITE_MODE) == false) {
                show_error('Could not make path!');
            }
            $config['upload_path'] = $upload_path;
            $config['allowed_types'] = 'gif|jpg|png';
            $config['max_size'] = '2048';
            $config['file_ext_tolower'] = true;
            //$config['encrypt_name'] = true; // might be a good idea
            $this->upload->initialize($config);
            // featured image
            if (!$this->upload->do_upload('featured')) {
                show_error($this->upload->display_errors());
            }
            $yacht_img = $this->upload->data('file_name');
            // multi images
            $slider_images = array();
            $multi_files = $_FILES['userfile'];
            if (!empty($multi_files['name'][0])) { // if slider images are required remove this if
                $multi_count = count($_FILES['userfile']['name']);
                for ($i = 0; $i < $multi_count; $i++) {
                    $_FILES['userfile']['name'] = $multi_files['name'][$i];
                    $_FILES['userfile']['type'] = $multi_files['type'][$i];
                    $_FILES['userfile']['tmp_name'] = $multi_files['tmp_name'][$i];
                    $_FILES['userfile']['error'] = $multi_files['error'][$i];
                    $_FILES['userfile']['size'] = $multi_files['size'][$i];
                    if (!$this->upload->do_upload()) {
                        // failure cleanup to prevent orphans
                        @unlink($upload_path . $yacht_img);
                        if (count($slider_images) > 0) {
                            foreach ($slider_images as $image) {
                                @unlink($upload_path . $image);
                            }
                        }
                        show_error($this->upload->display_errors());
                    }
                    $slider_images[] = $this->upload->data('file_name');
                }
            }
            $this->yacht_model->create_yacht($yacht_img, $slider_images);
        }
    }

Модель:

public function create_yacht($yacht_img, $slider_images) {
    $slug = url_title($this->input->post('title'));
    $data = array(
        'title' => $this->input->post('title'),
        'slug' => $slug,
        'img' => $yacht_img,
        'city' => $this->input->post('city'),
        'category' => $this->input->post('category'),
        'price' => $this->input->post('price'),
        'description' => $this->input->post('description')
    );
    $this->db->insert('yachts', $data);
    $insert_id = $this->db->insert_id();
    if (count($slider_images) > 0) {
        foreach ($slider_images as $image) {
            $this->db->insert('yacht_slider', array('yacht_slide_id' => $insert_id, 'slide' => $image));
        }
    }
}
0 голосов
/ 29 мая 2018

если вы используете mySQL 7, он поддерживает тип данных json, и вы можете сохранить его в виде массива.Если вы используете более низкую версию MySQL, лучшим решением является преобразование массива изображений в формат JSON, а затем вставьте его в таблицу.Для получения более подробной информации о JSON в MySQL вы можете обратиться https://dev.mysql.com/doc/refman/8.0/en/json.html#json-values

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...