【问题标题】:Arrays from multiple upload form, Upload images then insert to database (PHP, MySQL)来自多个上传表单的数组,上传图片然后插入数据库(PHP,MySQL)
【发布时间】:2012-06-25 18:28:42
【问题描述】:

语言:PHP / MySQL

我快疯了,我现在真的要问...我有一个多文件上传表单:

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

在一些 Javascript 的帮助下,在对该输入进行的每次更改时,它都会在另一个输入中附加一个文件名列表,+ 一个格式化字符串(从文件名中获取),所以 onchange 我们有一个如图所示的 布局下面(假设我们刚刚添加了一些图片):

几乎类似于: 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 . '';

      }
} ?>

(我使用Upload Class by Colin Verot 处理图片上传,他们的FAQ 教程处理this page, under: What about multiple uploads? 上的多个图片上传)

如果我只是上传图像,这将非常完美,但是我添加了将每个图像数据添加到我的数据库的功能。 & 这就是令人困惑的地方。

我确定关键是将 SQL 查询放在正确的 foreach 中,或者可能再做一个,但我已经尝试过了,它只为我提供了 1 个对于图像上传或标题的好结果,从来没有两者都有。

我需要将图片上传到网站,然后将其数据(包括图片路径)存储到我的数据库中。

请查看我的代码并告诉我如何解决这个问题?一个 sn-p 线索现在真的很棒,因为在尝试了所有我能想到的之后我已经很困惑了。非常感谢!

【问题讨论】:

  • 清理块的格式并更新您的帖子:if (!array_key_exists($i, $files))
  • 我很不确定该怎么做,那段代码来自 this page, under: What about multiple uploads? 上的上传类常见问题解答教程我真的不知道那段代码中哪个是哪个,但我有之前尝试过更改它并且上传停止工作,所以我把它留在那里。然而,我是添加部分的人:$imagename = $_POST['keyword'][$i];
  • 更新: 我收到了来自user:138383, Aaron W. 的正确答案他的评论是第一个,我尝试的第一个有效,但我无法标记它更正了,因为他删了。我已经以某种方式通知了他,如果他想重新提交,我会等待,然后我会将他的答案标记为正确。 (His answer was...) 只是为了感谢他。当它起作用时,我几乎死了。 :)
  • 感谢@Love - 未删除

标签: php mysql arrays forms file-upload


【解决方案1】:

您没有将 $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;
        ...
    }

【讨论】:

    【解决方案2】:

    我确实认为你的问题之一是你的 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,这意味着您只会得到一个输入值。

    【讨论】:

      【解决方案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.'")';
      

      【讨论】:

        猜你喜欢
        • 2016-08-17
        • 2016-03-02
        • 2012-12-05
        • 1970-01-01
        • 2013-03-02
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多