【问题标题】:Select files from 3 columns in mysql and zip them从 mysql 的 3 列中选择文件并压缩它们
【发布时间】:2016-08-22 18:21:38
【问题描述】:

我有存储文件名的数据库表。它们存储在 3 列中,每列中可以存储多个用逗号分隔的文件。像这样:file_idfile_1file_2file_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

我希望很清楚是什么样子。我想用 select 获取所有文件名,然后查看文件夹并以 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 次​​p>

数组 ( [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,)

【问题讨论】:

  • $resforeach(['file_1', ...]) 中的foreach($valid_files)$resArray 中包含什么?
  • 我已经更新了我的问题

标签: php mysql


【解决方案1】:

只需将这部分更改为:

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);
}

【讨论】:

  • 感谢您的回答。这种方式只从第一列下载一个文件。
  • 然后在 "file_exists($filePath . $resArray[$col])" 之前使用explode函数,然后检查每个项目并将其添加到valid_files数组中
  • 终于下载了所有文件。非常感谢!
  • 主机出现问题。我收到错误 500 并且网站崩溃。这是由于eAcceleratorPHP version is 5.39。您是否知道如何更改数组以停止崩溃。问题是主机上的这个缓存插件
猜你喜欢
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多