Массивы из нескольких форм загрузки, Загрузка изображений, а затем вставка в базу данных (PHP, MySQL)

Язык: PHP / MySQL

Я сойду с ума, мне действительно нужно спросить сейчас … У меня есть форма для загрузки нескольких файлов:

<input type="file" name="fileupload[]" multiple>

С помощью некоторого Javascript при каждом изменении, внесенном в этот ввод, он добавляет список имен файлов + форматированную строку (захваченную из имени файла) внутри другого ввода, поэтому в нашем случае мы имеем макет, как показано ниже (при условии, что мы просто добавлены некоторые изображения):

Несколько форм загрузки Почти похоже на: http://jsfiddle.net/pxfunc/WWNnV/4/


// Представление HTML такого макета будет … (предполагая, что мы добавили 3 изображения)

<input type="file" name="fileupload[]" multiple>

  • image-name-1.jpg <input type="text" value="Image Name 1" name="keyword[]">
  • justsome_file.png <input type="text" value="Justsome File" name="keyword[]">
  • some_Img-031.gif <input type="text" value="Some Img 031" name="keyword[]">

<input type="submit" value="Upload">


У меня это так, потому что, помимо загрузки файлов, я также хотел бы добавить их в свою базу данных с заголовком по умолчанию, основанным на его имени файла (и возможностью устанавливать / изменять этот заголовок для каждого изображения при его загрузке). Нет никаких проблем с моей формой.

ПРОБЛЕМА: Моя дилемма лежит внутри страницы PHP, на которой представлены данные / действие формы.

Я могу только обойтись:

  • Загружайте правильные изображения, но получайте одинаковое название для всех
  • Вставьте правильные заголовки, но получите одинаковое изображение для всех

Вот моя страница действий с PHP: (В настоящее время загружает правильные изображения, но имеет одинаковый заголовок для всех)

 <?php // CONNECT TO DATABASE... // INCLUDE UPLOAD CLASS LIBRARY include (dirname(__FILE__).'/lib/class.upload.php'); $files = array(); foreach ($_FILES['fileupload'] as $k => $l) { foreach ($l as $i => $v) { if (!array_key_exists($i, $files)) $files[$i] = array(); $files[$i][$k] = $v; $imagename = $_POST['keyword'][$i]; } } // create an array here to hold file names $uploaded = array(); foreach ($files as $file) { $generate_name = rand(100,99999); $generate_name_extra = rand(200,9999); $filenamex = "COVER_PHOTO_".$generate_name.$generate_name_extra."_".time(); $filenamex_thumb = $filenamex."_thumb"; $handle = new upload($file); if ($handle->uploaded) { $this_upload = array(); ///// 1 //////////////////////////////////////////////////////////////////// $handle->file_new_name_body = $filenamex_thumb; $handle->file_force_extension = true; $handle->image_resize = true; $handle->image_x = '300'; $handle->image_ratio_y = true; $handle->jpeg_quality = '100'; // ABSOLUTE PATH BELOW $handle->process($absoRoot.'covers/thumbs/'); //////////////////////////////////////////////////////////////////////////// if ($handle->processed) { // store the image filename $this_upload['image'] = $handle->file_dst_name; // Destination file name $this_upload['body'] = $handle->file_dst_name_body; // Destination file name body $this_upload['extension'] = $handle->file_dst_name_ext; // Destination file extension $category_id = $_POST['cat']; $hiddenvalues = explode ("|",$_POST["cat"]); $category = $hiddenvalues[0]; $category_name = $hiddenvalues[1]; $sql = 'INSERT INTO cover (id, img, keyword, category_name, cat_id) VALUES ("", "'.$this_upload['image'].'", "'.$imagename.'", "'.$category_name.'", "'.$category.'")'; mysql_query($sql); } $handle->clean(); header("Location: ./upload.php"); $message = ""; } else { echo ' file not uploaded to the wanted location'; echo ' Error: ' . $handle->error . ''; } } ?> 

(Я использую класс загрузки Colin Verot для обработки загрузок изображений и учебник по ним, чтобы обрабатывать MULTIPLE загрузки изображений на этой странице, в разделе: Что можно сказать о нескольких загрузках? )

Это будет работать идеально, если бы я просто загружал изображения, однако я добавил функциональность добавления каждого изображения в мою базу данных. & Это – то, где это вводит в заблуждение.

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

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

Пожалуйста, загляните в мой код и просветите меня, как решить эту проблему? Ключ фрагмента действительно был бы прекрасен, так как я уже очень смущен, попробовав все, что мог придумать. Спасибо огромное!

Solutions Collecting From Web of "Массивы из нескольких форм загрузки, Загрузка изображений, а затем вставка в базу данных (PHP, MySQL)"

Когда вы собираете информацию о файле, вы переписываете $imagename в каждый цикл, поэтому он будет назначен последнему. Попробуйте подключить его к переменной $files (надеюсь, это не связано с классом upload который вы используете).

 foreach ($l as $i => $v) { if (!array_key_exists($i, $files)) $files[$i] = array(); $files[$i][$k] = $v; $files[$i]['imagename'] = $_POST['keyword'][$i]; } 

Затем обновите строку $sql чтобы указать, что

 $sql = 'INSERT INTO cover (id, img, keyword, category_name, cat_id) VALUES ("", "'.$this_upload['image'].'", "'.$file['imagename'].'", "'.$category_name.'", "'.$category.'")'; 

Вы не сохраняете переменную $ imagename в массив $ files, вы просто перезагружаете ее каждый раз.

  $files[$i][$k] = $v; $imagename = $_POST['keyword'][$i]; 

Должно быть что-то вроде:

  $files[$i][$k] = array($v, $_POST['keyword'][$i]); ... foreach ($files as $data) { list($file, $imagename) = $data; ... } 

Я думаю, что одна из ваших проблем – ваш предлог:

 $files = array(); foreach ($_FILES['fileupload'] as $k => $l) { foreach ($l as $i => $v) { if (!array_key_exists($i, $files)) $files[$i] = array(); $files[$i][$k] = $v; $imagename = $_POST['keyword'][$i]; } } 

Итак, вы проходите через каждое из полей, присваивая их значение правильному файлу, который соответствует этой политике структуры:

 _FILES => array( 'name' => array(0 => 'file.txt'), 'size' => array(0 => 235) ) 

Что правильно для мультифилей, но тогда вы это делаете:

 $imagename = $_POST['keyword'][$i]; 

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