1

向大家问好,

我正在检查有关复制行的问题,但找不到解决方案或搜索错误。

我正在尝试上传多个文件并将一些信息存储在 2 个表中,这些表是在上传过程中同时创建的。

我有 2 个表,称为“媒体”和“pmedia”结构;

CREATE TABLE IF NOT EXISTS `media` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `product_id` int(1) unsigned NOT NULL default '0',
  `media_id` int(1) unsigned NOT NULL default '0',
  `ordering` int(2) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `i_product_id` (`product_id`,`media_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=267 ;

CREATE TABLE IF NOT EXISTS `pmedia` (;
  `media_id` int(11) unsigned NOT NULL auto_increment,
  `file_title` char(126) NOT NULL default '',
  `file_mimetype` char(64) NOT NULL default '',  
  PRIMARY KEY  (`media_id`),
  KEY `i_vendor_id` (`vendor_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=274 ;

我正在将多张图片上传到没有问题的“pmedia”;

$query="INSERT into pmedia (`file_title`,`file_mimetype`) VALUES ('$file_name','$file_type') ; ";

但同时我希望那些上传文件的自动创建列“media_id”也复制到“媒体”表..

结果应该是上传后;

在此处输入图像描述

EDIT2: 好的,这就是循环本身。我只是写错了。下面的代码在 Ruly 和 gaRex 的帮助和启发下工作。非常感谢。

编辑 :

这是结构,很抱歉缺少解释。(我不想在单个查询中这样做。)我应该如何实现循环?这样它只会将上传的数据写入pmedia。

<?php
if(isset($_FILES['files'])){
$errors= array();
foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
    $file_name = $_FILES['files']['name'][$key];
    $file_size =$_FILES['files']['size'][$key];
    $file_tmp =$_FILES['files']['tmp_name'][$key];
    $file_type=$_FILES['files']['type'][$key];

    if($file_size > 2097152){
        $errors[]='File size must be less than 2 MB';
    }       


        $query="INSERT into pmedia (`file_title`,`file_mimetype`) VALUES ('$file_name','$file_type') ; ";
        $media_id = mysql_insert_id();

        $query2="INSERT into media (`media_id`) VALUES ($media_id) ; ";


    $desired_dir="user_data";
    if(empty($errors)==true){
        if(is_dir($desired_dir)==false){
            mkdir("$desired_dir", 0700);        // Create directory if it does not exist
        }
        if(is_dir("$desired_dir/".$file_name)==false){
            move_uploaded_file($file_tmp,"$desired_dir/".$file_name);
        }else{                                  // rename the file if another one exist
            $new_dir="$desired_dir/".$file_name.time();
             rename($file_tmp,$new_dir) ;               
        }
     mysql_query($query);
     mysql_query($query2);  

    }else{
            print_r($errors);
    }
}
if(empty($error)){
    echo "Success";


} }
?>
<form action="" method="POST" enctype="multipart/form-data">
<input type="file" name="files[]" multiple/>
<input type="submit"/>
</form>
4

2 回答 2

2

有两种方法可以做到这一点:

  1. 运行多个查询

    执行后:

    $query="INSERT into pmedia (`file_title`,`file_mimetype`) VALUES ('$file_name','$file_type') ; ";
    

    获取新记录的 id,使用 mysqli_insert_id

    http://www.php.net/manual/en/mysqli.insert-id.php

    然后执行:

    $query="INSERT into media (`id`,`product_id`, `media_id`, `ordering`) VALUES ($id, $product_id, $media_id, $ordering) ; ";
    
  2. 使用触发器,但对于这种情况我敢肯定,因为我认为您可以从 pmedia 表中获取 id、product_id、ordering 的值

编辑:

要添加多行,您应该有一个循环,并且在循环中您应该执行这三个步骤。代码应该是这样的:

// Looping {
    $query="INSERT into pmedia (`file_title`,`file_mimetype`) VALUES ('$file_name','$file_type') ; ";

    $media_id = mysqli_insert_id($conn);

    $query="INSERT into media (`id`,`product_id`, `media_id`, `ordering`) VALUES ($id, $product_id, $media_id, $ordering) ; ";
// } Looping
于 2013-03-25T01:05:59.203 回答
0

为什么要在一个查询中向 pmedia 中插入多行?

最简单可靠的方法是在其中插入一行,然后才更新媒体表。

但如果你愿意,你可以试试这两种方法。他们都很脏:

  1. 向 pmedia 添加一些具有唯一值的列,可以在外部设置。让它成为我们可爱的 GUID(见 google)CHAR(36)。然后在脚本中生成这个值并设置为 pmedia 的每一行。之后您将不需要任何 mysql 的插入 ID,因为您已经生成了它们。然后,您可以通过在插入查询中引用 pmedia 来插入媒体表。

    插入 t1 (v1, v2) 值 ($v1, (select id from t2 where guid = $guid)), ...

  2. 开始交易。插入 pmedia,获取最后一条记录的 last_insert_id()。然后,您可以计算第一条记录的 id,因为您现在计算记录。

但请记住——两种方式都是肮脏和糟糕的。

于 2013-03-25T02:56:30.470 回答