我写了一个非常简单的网页表单,允许我的用户在他们的互联网浏览器中查看文本文件。
有时,输入的搜索条件会返回多个文件。所以我想实现一个功能,将搜索返回的文本文件压缩成ZIP。
我有一个原型工作,但它只压缩第一个文件。第二个或第三个文件被忽略。
这是我的代码
<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;
}
指向文件的超链接生成得很好。但是ZIP文件只包含结果中列出的第一个文件。
如何让ZIP文件捕获所有返回的文件?
感谢您的意见。
PS:新的ZipArchive()库/类在我们的生产环境中不可用,所以我选择使用Unix实用程序ZIP。
答案 0 :(得分:1)
这里有很多问题(安全性,因为看起来你没有清理你的数据库输入),但我猜这个问题是围绕$ ZIPresult变量。它没有出现(除非我遗漏了一些东西)你的文件名之间有空格,所以shell_exec调用试图压缩“file1.extfile2.extfile3.ext”。看看如果修改这一行会发生什么:
$ZIPresult .= basename($mydir) . '/' . $filename.' ';