我试图将以前上传的文件加载到MySQL数据库中。文件存储在文件夹中,同时提交表单,其中预览页面将包含指向这些文件的超链接(类似于附件)
我得到的问题是:
我的代码中的foreach命令可能出错。
请查看附图,了解加载文件后的外观。
<?php
include('dbconfig.php');
date_default_timezone_set('Europe/Oslo');
$loaddate1 = date('Y-m-d');
$loadtime1 = date('H-i-s');
?>
<form name="myForm" id="myForm" class="workshop add" action="" method="post" enctype="multipart/form-data">
<input id="" type="text" name="toolsn" value="">
<input id="" type="text" name="actioninsertdate" value="<?php echo $loaddate1;?>" readonly> <br/>
<input id="" type="text" name="actioninserttime" value="<?php echo $loadtime1;?>" readonly><br/>
<input type="file" name="files[]" multiple/><br/>
<button type="submit" name="submit">Submit</button></div>
</form>
<?php
if(isset($_POST['submit']))
{
$path = 'images/';
$toolsn = $_POST['toolsn'];
$actioninsertdate = $_POST['actioninsertdate'];
$actioninserttime = $_POST['actioninserttime'];
$errors= array();
foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
$file_name = $key.$_FILES['files']['name'][$key];
$file_basename = substr($file_name, 0, strripos($file_name, '.')); // get file extension
$file_ext = substr($file_name, strripos($file_name, '.')); // get file name
$file_size =$_FILES['files']['size'][$key];
$file_tmp =$_FILES['files']['tmp_name'][$key];
$file_type=$_FILES['files']['type'][$key];
$newfilename = $toolsn.'-'.$loaddate1.'_'.$loadtime1.'_'.rand(1,20).$file_ext;
if($file_size > 2097152){
$errors[]='File size must be less than 2 MB';
}
$query="INSERT workshop1 SET toolsn='$toolsn',file='$newfilename',type='$file_type',size='$file_size',actioninsertdate='$actioninsertdate',actioninserttime = '$actioninserttime'"
or die(mysqli_error ($connection));
if(empty($errors)==true || empty($toolsn)==false){
if(is_dir($path.$toolsn)==false){
mkdir("images/$toolsn", 0700); // Create directory if it does not exist
}
if(is_dir("images/$toolsn/".$file_name)==false){
//$newfilename = $toolsn.'-'.$loaddate1.'_'.$loadtime1.'_'.rand(1,4).$file_ext;
move_uploaded_file($file_tmp,"images/$toolsn/".$newfilename);
}else{ // rename the file if another one exist
//$newfilename = $toolsn.'-'.$loaddate1.'_'.$loadtime1.'_'.rand(1,4);
$new_dir="images/$toolsn/".time().$newfilename;
rename($file_tmp,$new_dir) ;
}
mysqli_query($connection, $query);
}else{
print_r($errors);
}
}
}
?>
<?php
include('dbconfig.php');
$sqls=mysqli_query($connection, "
SELECT
GROUP_CONCAT(DISTINCT toolsn SEPARATOR '<br />') as toolsn,
GROUP_CONCAT(DISTINCT type SEPARATOR '<br />') as type,
GROUP_CONCAT(DISTINCT file ORDER BY type SEPARATOR '<br />') as file,
GROUP_CONCAT(DISTINCT actioninsertdate SEPARATOR '<br />') as actioninsertdate,
GROUP_CONCAT(DISTINCT actioninserttime SEPARATOR '<br />') as actioninserttime
from workshop1
group by actioninserttime");
//get feedback why database not working
if (!$sqls) {
printf("Error: %s\n", mysqli_error($connection));
exit();
}
?>
<table id="table" class="table table-hover table-responsive">
<thead class="thead-default">
<tr>
<th>Toolsn</th>
<th>Date added</th>
<th>Time added</th>
<th>Attachment</th>
</tr>
</thead>
<?php
echo '<tbody id="tbody"><tr>';
while ($row = mysqli_fetch_array($sqls)) {
echo '<td>'.$row['toolsn'].'</td>';
echo '<td>'.$row['actioninsertdate'].'</td>';
echo '<td>'.$row['actioninserttime'].'</td>';
echo '<td>';
$eachtoolsn=explode('<br />',$row['toolsn']);
$eachfile=explode('<br />',$row['file']);
$eachtype=explode('<br />',$row['type']);
foreach($eachfile as $listfile) {
//echo $listfile;
foreach($eachtoolsn as $key => $listoolsn) {
//echo [$key];
}
foreach($eachtype as $listtype) {
if ($listtype === 'image/jpeg'){
echo '<a href="images/'.$row['toolsn'].'/'.$listfile.'" target="_blank"><img src="images/'.$row['toolsn'].'/'.$listfile.'" width="48" height="48"></a>';
} elseif ($listtype === 'application/pdf'){
echo '<a href="images/'.$row['toolsn'].'/'.$listfile.'" target="_blank"><img src="images/icon-pdf.png" width="48" height="48"></a>';
}
}
echo '</td>';
echo '</tr>';}
echo '</tbody></table>';
?>
答案 0 :(得分:0)
你的逻辑不好:
<?php
foreach($eachfile as $listfile) {
foreach($eachtype as $listtype) { // <= your bug is here
if ($listtype === 'image/jpeg'){
echo '<a href="images/'.$row['toolsn'].'/'.$listfile.'" target="_blank"><img src="images/'.$row['toolsn'].'/'.$listfile.'" width="48" height="48"></a>';
} elseif ($listtype === 'application/pdf'){
echo '<a href="images/'.$row['toolsn'].'/'.$listfile.'" target="_blank"><img src="images/icon-pdf.png" width="48" height="48"></a>';
}
}
}
以下是新版本:
<?php
foreach($eachfile as $key => $listfile) {
if ($eachtype[$key] === 'image/jpeg')
echo '<a href="images/'.$row['toolsn'].'/'.$listfile
.'" target="_blank"><img src="images/'.$row['toolsn']
.'/'.$listfile.'" width="48" height="48"></a>';
elseif ($eachtype[$key] === 'application/pdf')
echo '<a href="images/'.$row['toolsn'].'/'.$listfile
.'" target="_blank"><img src="images/icon-pdf.png" '
.'width="48" height="48"></a>';
}
$key
是您使用explode()
生成的数组中的行的索引
$eachfile = array(
0=>'file1',
1=>'file2',
)
$eachtype = array(
0=>'PDF',
1=>'JPG',
)
所以你只需使用你文件的密钥来获得该类型的好行。
答案 1 :(得分:0)
如果只上传了一个扩展程序,我设法获得了杰出的文件预览。如果我上传了包含2个不同扩展名的多个文件,那么我无法使代码能够在上传的PDF文件将在预览中获得PDF图标的情况下运行。 所有文件都可以具有相同的图标(不同的代码)或在图像上显示。 出于某种原因,当GROUP_CONCAT用于收集按&#34; actioninsertime&#34;分组的一个或多个文件时,会发生这种情况。
图片预览:
使用的代码:
$eachfile=explode('<br />',$row['file']);
$eachtype=explode('<br />',$row['type']);
$eachextension=explode('<br />',$row['extension']);
foreach ($eachtype as $listtype){}
foreach ($eachextension as $listextension){}
foreach ($eachfile as $listfile){
if ($listextension === 'pdf') {
echo '<a href="images/'.$row['toolsn'].'/'.$listfile.'" target="_blank"><img src="images/icon-pdf.png" width="48" height="48"></a>';}
}
foreach ($eachfile as $listfile){
if ($listextension === 'jpg') {
echo '<a href="images/'.$row['toolsn'].'/'.$listfile.'" target="_blank"><img src="images/'.$row['toolsn'].'/'.$listfile.'" width="48" height="48"></a>';}
}