【发布时间】:2022-01-06 23:47:50
【问题描述】:
我有一个包含多行的表单(来自 SQL 的行,迭代并生成表单)。 这些行中的每一行都有一个多文件输入字段(用户可以在每个输入中上传 0、1 或多个)。 文件正在正确上传,并正确分配了新文件名(文件名是根据每行 SQL ID 生成的)。 然后在用户单击提交后,文件名将添加到 SQL 表中的列中。
表单可以生成 0, 1 ... 100 行,因此为了防止 php 遍历所有这 100 行,并执行 UPDATE 或不需要的行,我只对用户执行 UPDATE摸过。
我的问题是当我在单个文件输入字段(一行)上上传单个或多个文件时,一切都按预期工作。 但是,当我尝试在单独的文件输入字段中上传 1 个或多个文件时,SQL 中发生了一些奇怪的事情,上传到服务器的文件都可以,但是数据库变得很奇怪。
- 根据需要,第一个输入(行)将包含正确数量的正确名称的文件。
- 每个下一个输入(行,在 UPDATE 之后的数据库中)将包含所有先前输入的所有文件名,加上为特定输入上传的文件名...如果这有意义...这里插图:
Input 1: input1file1.jpg, input1file2.jpg
Input 2: input1file1.jpg, input1file2.jpg, input2file1.jpg
因为每个输入字段可以带多个文件,所以输入名称已经是一个数组 name='attachment[]'。
为了区分这些输入字段,我在文件名中添加了行 ID。
这是我的代码,我不知道是什么原因造成的?
表格:
<form enctype="multipart/form-data" method="post">
...
php iteration:
<div>
<input class="hasChanged" name="attachments'.$row['pk'].'[]" type="file" multiple>
<input value="'.$row['existing_attachments'].'" id="updateAttachmentValue'.$row['pk'].'" name="existingAttachments'.$row['pk'].'">
</div>
...
</form>
PHP:
//iterate
foreach($_POST['foo_field'] as $key => $n){
if(in_array($upl[$key], $touched_rows)){
$aID = $upl[$key];
$prevAttachments = (empty($_POST['existingAttachments'.$aID]) || $_POST['existingAttachments'.$aID]=='|') ? NULL : $_POST['existingAttachments'.$aID];
$attachments = NULL;
if(count($_FILES['attachments'.$aID]['name']) > 0){
if(!empty($_FILES['attachments'.$aID])){
for($i=0; $i<count($_FILES['attachments'.$aID]['name']); $i++){//Loop through each file
$tmpFilePath = $_FILES['attachments'.$aID]['tmp_name'][$i];//Get the temp file path
if($tmpFilePath != ''){//Make sure we have a filepath
$shortname = 'AP-'.$aID.'-'.$_FILES['attachments'.$aID]['name'][$i];//save the filename
$filePath = $attachmentDirectory.'\AP-'.$aID.'-'.$_FILES['attachments'.$aID]['name'][$i];//save the url and the file
if(move_uploaded_file($tmpFilePath, $filePath)){//Upload the file into the correct dir
$files[] = $shortname;
}
$attachments = implode('|',$files);
}
}
}
}
$prevAttachments = !empty($attachments) ? $attachments.'|'.$prevAttachments : $prevAttachments;
try{
$stmt = $conn->prepare("EXEC [name].[dbo].[table] :p1,:p2");
$stmt->bindParam(':p1', $upl[$key], PDO::PARAM_INT);
$stmt->bindParam(':p2', $prevAttachments, PDO::PARAM_STR);
$stmt->execute();
}catch(PDOException $e){ echo 'ERROR: ' . $e->getMessage();}
}
}
【问题讨论】:
-
听起来你需要在每个“行”的开头设置
$files = array();。 -
您似乎将多个附件名称存储在数据库的单个列中,尽管我不熟悉您发布的查询。如果您正在在一列中存储多个值,我建议这将成为未来问题的根源,您应该真正考虑将它们存储在具有合适链接的单独表中。 “数据库规范化”是使用的术语。
-
@cOle2 谢谢,这已经解决了这个问题。请提交作为答案,我会接受的。
标签: php html file-upload