Chris
Chris

Reputation: 1697

Unable to zip more than one file at a time

I wrote a very simple web form that allows my user to view text files from within their Internet browser.

Occasionally, the search criteria entered returns more than one file. So I want to implement a feature whereby the text files returned by the search are compressed into a ZIP.

I got a prototype working but it only compresses the first file. The second or third files are ignored.

Here's my code

<HTML><body><form name="myform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<fieldset><label for="DBRIDs">RIDs</label><input type="text" id="DBRIDs" name="DBRIDs" >
</fieldset></form></body></HTML>
<?php
function check_search() {
 if (isset($_POST['submit'])) {if (!empty($_POST['DBRIDs'])) { $results = getFiles(); }
        }       else $errors = "Please enter something before you hit SUBMIT.";
 return Array($results, $errors);
}
function getFiles() {
 $result = null;
 $ZIPresult = null;
 if (empty($_POST['DBRIDs'])) { return null; }
 $mydir = MYDIR; 
 $dir = opendir($mydir);
 $DBRIDs = $_POST['DBRIDs'];
 $getfilename = mysql_query("select filename from search_table where rid in (" . $DBRIDs . ")") or die(mysql_error());
 while ($row = mysql_fetch_array($getfilename)) {
 $filename = $row['filename'];
 $result .= '<tr><td><a href="' . basename($mydir) . '/' . $filename . '" target="_blank">' . $filename . '</a></td></tr>';
 $ZIPresult .= basename($mydir) . '/' . $filename;
} 
if ($result) {
$result = "<table><tbody><tr><td>Search Results.</td></tr> $result</table>";
shell_exec("zip -9 SearchResult.zip ". $ZIPresult ." > /dev/null ");
} return $result;
}

The hyperlinks pointing to the file(s) are generated just fine. The ZIP file however only contains the first file listed in the results.

How can I get the ZIP file to capture ALL the files returned??

Thanks for your input.

PS: The new ZipArchive() library/class is not available on our production environment so I chose to use the Unix utility ZIP instead.

Upvotes: 0

Views: 84

Answers (1)

Ben D
Ben D

Reputation: 14499

There are a number of issues here (security, for one, as it appears that you're not sanitizing your DB inputs), but I'm guess the issue is around the $ZIPresult variable. It doesn't appear (unless I'm missing something) that you have any spaces between your file names, so the shell_exec call is trying to zip "file1.extfile2.extfile3.ext". See what happens if you modify this line:

$ZIPresult .= basename($mydir) . '/' . $filename.' ';

Upvotes: 1

Related Questions