我有存储文件名的数据库表。它们存储在 3 列中,每列中可以存储多个用逗号分隔的文件。像这样:file_id
、file_1
、file_2
和file_3
是列名
file_id | file_1 | file_2 | file_3
1 file_1.txt, file_1.1.txt.. | file_2.txt,file_2.2.txt | file_3.txt,file_3.3.txt
我希望清楚是什么样子的。我想用选择获取所有文件名,然后在文件夹中查找并以zip格式下载。所以我到目前为止所拥有的是
$filePath = 'uploads/';
$sql = "SELECT * FROM uploads WHERE file_id = 1"; // just for testing
$result = $pdo->prepare($sql);
//$result->bindParam(":id", $id);
$result->execute();
$resArray = $result->fetch();
foreach(['file_1', 'file_2', 'file_3'] as $col){
if (file_exists($filePath . $resArray[$col])){
$valid_files[] = $resArray[$col];
}
}
if(count($valid_files > 0)){
$zip = new ZipArchive();
$zip_name = "zipfile.zip";
if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE){
$error .= "* Sorry ZIP creation failed at this time";
}
foreach($valid_files as $res){
$zip->addFile($filePath.$res['file_1']);
$zip->addFile($filePath.$res['file_2']);
$zip->addFile($filePath.$res['file_3']);
}
//print_r($valid_files);
$zip->close();
// zip download
}
当我运行代码时,我遇到错误
Warning: Illegal string offset 'file_1' in ...
Warning: Illegal string offset 'file_2' in ...
Warning: Illegal string offset 'file_3' in ...
更新:
print_r($res);
仅包含file_1
列中的 1 个文件
file_1.txt
print_r($resArray);
包含所有列中的所有文件..奇怪的是每个文件在数组中是2次
数组 ( [file_1] => file_1.txt [0] => file_1.txt [file_2] => file_2.txt , [1] => file_2.txt , [file_3] => file_3.txt ,file_3.3.txt .jpg,file_3.3.txt,file_3.3.txt,file_3.3.txt,[2] => file_3.3.txt,file_3.3
.txt,file_3.3.txt,file_3.3.txt,file_3.3.txt, )
只需将此部分更改为:
foreach(['file_1', 'file_2', 'file_3'] as $col){
$items = explode(',', $resArray[$col]);
foreach ($items as $item) {
if (file_exists($filePath . trim($item))){
$valid_files[] = $filePath . trim($item);
}
}
}
然后,您将能够像下面一样使用它:
foreach($valid_files as $res){
$zip->addFile($res);
}