如何在创建时复制行?

时间:2013-03-25 00:38:20

标签: mysql copy row

向大家致意,

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

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

我有两个名为“media”和“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”也复制到“媒体”表中。

结果应该在上传后;

enter image description here

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>

2 个答案:

答案 0 :(得分: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,订购的价值

  3. 修改

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

    // 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
    

答案 1 :(得分:0)

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

最简单可靠的方法是在那里插入一行,然后再更新媒体表。

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

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

    插入t1(v1,v2)值($ v1,(从t2选择id,其中guid = $ guid)),...

  2. 启动交易。插入到pmedia中,获取最后一条记录的last_insert_id()。然后,您可以计算第一条记录的ID,因为您现在计算记录数。

  3. 但请记住 - 两种方式都很脏而且很糟糕。