向大家致意,
我正在检查有关复制行的问题,但我找不到解决方案,或者我找错了。
我正在尝试上传多个文件并在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”也复制到“媒体”表中。
结果应该在上传后;
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>
答案 0 :(得分:2)
有两种方法可以做到:
运行多个查询
执行后:
$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) ; ";
使用触发器,但对于这种情况,我确信,因为我认为你可以从pmedia表中获取id,product_id,订购的价值
修改强>
要添加多行,您应该有一个循环,并且在循环中您应该执行这三个步骤。代码应该是这样的:
// 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?
最简单可靠的方法是在那里插入一行,然后再更新媒体表。
但如果你愿意,你可以试试这两种方式。他们都很脏:
向pmedia添加一些具有唯一值的列,可以在外部设置。让它成为我们可爱的GUID(见谷歌)CHAR(36)。然后在脚本中生成此值并设置为pmedia的每一行。在您不需要任何mysql的插入ID之后,您将已经生成它们。然后,您可以通过在插入查询中引用pmedia来插入到媒体表中。
插入t1(v1,v2)值($ v1,(从t2选择id,其中guid = $ guid)),...
启动交易。插入到pmedia中,获取最后一条记录的last_insert_id()。然后,您可以计算第一条记录的ID,因为您现在计算记录数。
但请记住 - 两种方式都很脏而且很糟糕。