Зипване и сваляне на всички намерени файлове от 3 колони

vinsbg

Registered
На форма за качване на файлове има 3 полета за качване. 2 от тях позволяват само по 1 файл, а третото много. В третата колона се записват разделени със запетая. До тук добре. Сега искам всички id-та които са добавени в импровизираната количка да ги свалям зипнати.

До момента успявам само 1 файл от 1-та колона да зипна и сваля. Как да добавя и другите 2 колони и да събира абсолютно всички файлове.
Пример:
Код:
SELECT upload_lesson_plan, upload_worksheet, upload_materials FROM document_upload WHERE upload_id = :id
А ето и целия код
Код:
$filePath = 'uploads/';

$files = $_SESSION['itemid'];

$valid_files = array();
if(is_array($files)) {
    foreach($files as $file) {
    
        $sql = "SELECT upload_lesson_plan, upload_worksheet, upload_materials FROM document_upload WHERE upload_id = :id"; 
        $result = $pdo->prepare($sql);
        $result->bindParam(":id", $file);
        $result->execute();                 

        $resArray = $result->fetch();
        
        /*if (file_exists($filePath . $resArray['upload_materials'])) {
            $valid_files[] = $resArray;
            
        } */
	foreach(['upload_lesson_plan', 'upload_worksheet', 'upload_materials'] 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['upload_lesson_plan']);
        $zip->addFile($filePath.$res['upload_worksheet']);
        $zip->addFile($filePath.$res['upload_materials']);
    }
    $zip->close();
    if(file_exists($zip_name)){
        // force to download the zip
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private",false);
        header('Content-type: application/zip');
        header('Content-Disposition: attachment; filename="'.$zip_name.'"');
        readfile($zip_name);
        // remove zip file from temp path
        unlink($zip_name);
        unset($_SESSION['itemid']);
    }
 
}
Проблема е тук
Код:
    foreach($valid_files as $res){
        $zip->addFile($filePath.$res['upload_lesson_plan']);
        $zip->addFile($filePath.$res['upload_worksheet']);
        $zip->addFile($filePath.$res['upload_materials']);
    }
Като в момента дава грешка
Код:
Warning: Illegal string offset 'upload_lesson_plan' in ...
Warning: Illegal string offset 'upload_worksheet' in ...
Warning: Illegal string offset 'upload_materials' in ...
 
Дай едно print_r на $valid_files да видиш как са ти в масива, промени линията на
PHP:
$valid_files[$col] = $resArray[$col];
 
lam3r4370 каза:
Дай едно print_r на $valid_files да видиш как са ти в масива
print_r($valid_files);
Код:
Array ( [0] => 4aa2fe72920867b2cce936c78adea341.pdf )
Което е файл от upload_lesson_plan.. двете колони upload_lesson_plan и upload_worksheet са колоните с по 1 файл..
print_r($resArray); връща това.. по 1 файл от всяка колона по 2 пъти...:idea:
Код:
Array ( [upload_lesson_plan] => 4aa2fe72920867b2cce936c78adea341.pdf [0] => 4aa2fe72920867b2cce936c78adea341.pdf [upload_worksheet] => bb3fc60086e184d2d06ff08a1e1d6b64.rar, [1] => bb3fc60086e184d2d06ff08a1e1d6b64.rar, [upload_materials] => e4566814a7923b463828a82419260c59.php,bdecde5e9b18e574c35ffd8b79e040ab.php, [2] => e4566814a7923b463828a82419260c59.php,bdecde5e9b18e574c35ffd8b79e040ab.php, )

след промяната на
Код:
	foreach(['upload_lesson_plan', 'upload_worksheet', 'upload_materials'] as $col){
	    if (file_exists($filePath . $resArray[$col])){
	        $valid_files[$col] = $resArray[$col];
	    }
	}
print_r($valid_files ); показва
Array ( [upload_lesson_plan] => 4aa2fe72920867b2cce936c78adea341.pdf )
 
Това работи на локалния хост и сваля всичко
Код:
$valid_files = array();
if(is_array($files)) {
    foreach($files as $file) {
    
        $sql = "SELECT upload_lesson_plan, upload_worksheet, upload_materials FROM document_upload WHERE upload_id = :id"; 
        $result = $pdo->prepare($sql);
        $result->bindParam(":id", $file);
        $result->execute();                 

        $resArray = $result->fetch();

	foreach(['upload_lesson_plan', 'upload_worksheet', 'upload_materials'] as $col){
	    $items = explode(',', $resArray[$col]);
	    foreach ($items as $item) {
	
	        if (file_exists($filePath . trim($item))){
	             $valid_files[] = $filePath . trim($item);
	        }
	    }
	}	
	
    }    
}

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($res);
	}
на хоста на който трябва обаче не работи и дава грешка 500.. проблема е в кеширащия плъгин на хоста eAccelerator ...

Някой да има идея сега, какво не му харесва? Нещо свързано с array-ите ще да е. Версията на PHP-то е PHP Version 5.3.29 :cry: :cry:
 
vinsbg каза:
Това работи на локалния хост и сваля всичко
Код:
$valid_files = array();
if(is_array($files)) {
    foreach($files as $file) {
    
        $sql = "SELECT upload_lesson_plan, upload_worksheet, upload_materials FROM document_upload WHERE upload_id = :id"; 
        $result = $pdo->prepare($sql);
        $result->bindParam(":id", $file);
        $result->execute();                 

        $resArray = $result->fetch();

	foreach(['upload_lesson_plan', 'upload_worksheet', 'upload_materials'] as $col){
	    $items = explode(',', $resArray[$col]);
	    foreach ($items as $item) {
	
	        if (file_exists($filePath . trim($item))){
	             $valid_files[] = $filePath . trim($item);
	        }
	    }
	}	
	
    }    
}

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($res);
	}
на хоста на който трябва обаче не работи и дава грешка 500.. проблема е в кеширащия плъгин на хоста eAccelerator ...

Някой да има идея сега, какво не му харесва? Нещо свързано с array-ите ще да е. Версията на PHP-то е PHP Version 5.3.29 :cry: :cry:
Ако това ти е целия код си изтървал една скоба.
 
Не е целия.. отдолу под foreach-a за зипването има още малко, който форсва зипа да се свали и под него се затваря скобата..
 
Успях да намеря коя част предизвиква грешка 500 и тя е тази
Код:
foreach(['upload_lesson_plan', 'upload_worksheet', 'upload_materials'] as $col){
	    $items = explode(',', $resArray[$col]);
	    foreach ($items as $item) {
	
	        if (file_exists($filePath . trim($item))){
	             $valid_files[] = $filePath . trim($item);
	        }
	    }
	}
 
vinsbg каза:
Успях да намеря коя част предизвиква грешка 500 и тя е тази
Код:
foreach(['upload_lesson_plan', 'upload_worksheet', 'upload_materials'] as $col){
	    $items = explode(',', $resArray[$col]);
	    foreach ($items as $item) {
	
	        if (file_exists($filePath . trim($item))){
	             $valid_files[] = $filePath . trim($item);
	        }
	    }
	}
PHP:
foreach(['upload_lesson_plan', 'upload_worksheet', 'upload_materials'] as $col){
Интересна техника,
Защо не го направиш по "другия" начин?
 
uphero каза:
vinsbg каза:
Успях да намеря коя част предизвиква грешка 500 и тя е тази
Код:
foreach(['upload_lesson_plan', 'upload_worksheet', 'upload_materials'] as $col){
	    $items = explode(',', $resArray[$col]);
	    foreach ($items as $item) {
	
	        if (file_exists($filePath . trim($item))){
	             $valid_files[] = $filePath . trim($item);
	        }
	    }
	}
PHP:
foreach(['upload_lesson_plan', 'upload_worksheet', 'upload_materials'] as $col){
Интересна техника,
Защо не го направиш по "другия" начин?
А кой е другия начин?
 
Да, по другия начин мисля стана.
Код:
    foreach($files as $file) {
    
        $sql = "SELECT upload_lesson_plan, upload_worksheet, upload_materials FROM document_upload WHERE upload_id = :id"; 
        $result = $pdo->prepare($sql);
        $result->bindParam(":id", $file);
        $result->execute();                 

        $resArray = $result->fetch();


	foreach($resArray as $col){
	    $items = explode(',', $col);
	   
	    foreach ($items as $item) {
	        if (file_exists($filePath . trim($item))){
	             $valid_files[] = $filePath . trim($item);
	        }	    
	    }	    
	}
	
    }
 

Back
Горе