簡體   English   中英

來自多個上傳表單的數組,上傳圖像然后插入數據庫(PHP,MySQL)

[英]Arrays from multiple upload form, Upload images then insert to database (PHP, MySQL)

語言: PHP / MySQL

我想出去了,我現在真的要問...我有一個多文件上傳表格:

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

在一些Javascript的幫助下,在對此輸入所做的每次更改中,它會在另一個輸入中附加一個文件名列表,+一個格式化的字符串(從文件名中抓取),所以onchange我們有一個如下所示布局 (假設我們只是添加了一些圖片):

多個上傳表格 幾乎類似於: 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上傳類來處理圖片上傳,以及他們的常見問題解答教程,以便在此頁面上處理多個圖像上傳, 如下所示: 多個上傳怎么辦?

如果我只是上傳圖像,這將是完美的,但我添加了將每個圖像數據添加到我的數據庫的功能。 這是令人困惑的地方。

我確定關鍵是將SQL查詢放在正確的foreach中,或者可能再創建另一個,但我已經嘗試過了,它只為我提供了一個很好的結果,無論是圖像上傳還是標題,從來都沒有。

我需要將圖像上傳到網站,然后將其數據(包括圖像路徑)存儲到我的數據庫。

請查看我的代碼並賜教我如何解決這個問題? 一個片段線索現在真的很棒,因為我已經嘗試了所有我能想到的東西后已經非常困惑。 非常感謝!

您沒有將$ 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,這意味着你只能得到一個輸入值。

當您收集文件信息時,您在每個循環上覆蓋$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.'")';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM