我希望我的脚本将在下载文件后执行,因此在此代码的第一部分中,它将获取.txt文件并将word许可证更改为数据库结果,然后我希望下载开始,之后我想清除.txt文件以供下次使用。如果我如下所述编写,我不会在文本文件中获得数据库结果,因为它在下载之前首先执行整个代码。如果我删除最后一部分,它都工作,但它不会重置文本。
<?php
$userID= $_SESSION['user_id'];
$license=$dbConnection->getOne("SELECT license FROM valid_license where discordid = '$userID' ");
$license2 = $license['license'];
$zip = new ZipArchive;
$fileToModify = 'license.txt';
if ($zip->open('test.zip') === TRUE) {
$oldContents = $zip->getFromName($fileToModify);
$newContents = str_replace('license', $license2, $oldContents);
$zip->deleteName($fileToModify);
$zip->addFromString($fileToModify, $newContents);
$zip->close();
echo 'ok';
} else {
echo 'failed';
}
header("Location: test.zip");
$userID= $_SESSION['user_id'];
$license=$dbConnection->getOne("SELECT license FROM valid_license where discordid = '$userID' ");
$license2 = $license['license'];
$zip = new ZipArchive;
$fileToModify = 'license.txt';
if ($zip->open('test.zip') === TRUE) {
$oldContents = $zip->getFromName($fileToModify);
$newContents = str_replace($license2, 'license', $oldContents);
$zip->deleteName($fileToModify);
$zip->addFromString($fileToModify, $newContents);
$zip->close();
echo 'ok';
} else {
echo 'failed';
}
?>
1条答案
按热度按时间vfh0ocws1#
发生这种情况有两个潜在原因:
1.您的Web服务器在向用户提供 any 响应之前等待PHP完成执行,因此后半部分将在发送头之前覆盖zip文件。
1.您的Web服务器正在无延迟地发送
Location:
标头,但在响应和后续请求进行时,PHP代码仍在执行,从而在文件请求返回之前覆盖数据。这两种情况都将破坏您的预期流。
不要使用
Location:
头文件,而是为zip文件设置适当的Content-Type:
头文件,将数据转储给用户,然后 * 清理文件。另外,不要像这样修改原始的zip文件。如果你收到两个重叠的请求,你会得到错误的许可证,或者只是破坏了一个或两个或所有后续的文件。
制作副本、修改副本、送达副本、删除副本。