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

язык: PHP / MySQL

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

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

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

Multiple Upload Formпочти аналогично: 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 для обработки загрузки изображений и их FAQ учебник для обработки нескольких загрузок изображений на в этом разделе: как насчет нескольких загрузок?)

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

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

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

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

3 ответов


когда вы собираете информацию о файле, вы перезаписываете $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;
        ...
    }

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

$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 каждый раз с последним взглядом, что означает, что вы когда-либо получите только один вход vlaue.