6

言語: PHP / MySQL

私は頭がおかしくなっています、本当に今尋ねなければなりません...複数ファイルのアップロードフォームがあります:

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

Javascript の助けを借りて、この入力に変更が加えられるたびに、別の入力内にファイル名のリスト + フォーマットされた文字列 (ファイル名から取得された) が追加されるため、変更時に以下に示すようなレイアウトになります(単にいくつかの画像を追加しました):

複数アップロードフォーム ほぼ同様: http://jsfiddle.net/pxfunc/WWNnV/4/


// このようなレイアウトの HTML 表現は... (3 つの画像を追加したと仮定)

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

  • 画像名-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によるUpload Classを使用して画像のアップロードを処理し、FAQ チュートリアルを使用して、このページの複数の画像のアップロードを処理します:複数のアップロードについては? )

これは、画像をアップロードするだけであれば完璧に機能しますが、各画像データをデータベースに追加する機能を追加しました。& ここがややこしいところです。

キーは正しい foreach 内に SQL クエリを配置するか、おそらく別のクエリを作成することだと確信していますが、それを試してみましたが、画像のアップロードまたはタイトルのいずれかに対して 1 つの良い結果しか得られず、両方に対しては決して得られません。

画像をサイトにアップロードし、そのデータ (画像パスを含む) をデータベースに保存する必要があります。

私のコードを調べて、この問題を解決する方法を教えてください。考えられるすべてを試した後、私はすでに非常に混乱しているので、スニペットの手がかりは今のところ本当に素晴らしいでしょう. どうもありがとう!

4

3 に答える 3

2

あなたの問題の1つはあなたの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 を上書きしているため、入力値は 1 つしか取得できません。

于 2012-06-25T18:58:48.933 に答える
2

$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;
        ...
    }
于 2012-06-25T18:49:23.137 に答える
1

ファイル情報を収集しているときは$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.'")';
于 2012-06-25T18:57:42.563 に答える