我想让我的用户下载一个.php文件。
每个文件都因用户而异:
在第20行,我定义了一个等于用户ID的变量。
为此,我尝试了以下操作:复制原始文件。读到第19行(fgets
),然后读到第fputs
行(PHP行),然后提供要下载的文件。
问题是,这一行不是在第19行之后插入的,而是在.php文件的末尾。这是代码:
if (is_writable($filename)) {
if (!$handle = fopen($filename, 'a+')) {
echo "Cannot open file ($filename)";
exit;
}
for ($i = 1; $i <= 19; $i++) {
$offset = fgets($handle);
}
if (fwrite($handle, $somecontent) === FALSE) {
exit;
}
fclose($handle);
}
你会怎么做?
追加模式+a
将句柄的指针放置在文件的末尾。您的fgets()循环将失败,因为文件末尾没有剩余的可读取内容。你基本上做了19次不动手术。然后,您的fwrite将在文件末尾输出您的新值,正如预期的那样。
要执行插入操作,您需要将句柄rewind()
放到开头,然后执行fgets()循环。
然而,如果你只是想让人们得到这个修改过的文件,为什么要麻烦做"打开文件,扫描,写更改,提供文件"呢?这将在您的系统中留下大量近乎重复的内容。一个更好的方法是将你的文件分成两部分,然后你可以做一个简单的:
readfile('first_part.txt');
echo "The value you want to insert";
readfile('last_part.txt');
这样就不用每次都保存"新"文件了。这也将允许任意长度的插入。您的fwrite方法可能会丢弃文件的后面部分。例如,您扫描到偏移量"10"并写出4个字节,这将替换原始文件中该位置的原始4个字节。在某个时刻,它可能会变成5个字节的输出,现在你已经破坏了原始文件中的一个字节,可能有一个损坏的文件。
a+模式表示:
"a+"开放阅读和写作;将文件指针放在文件的末尾。如果文件不存在,请尝试创建它。
你可能想要r+
'r+'开放阅读和写作;将文件指针放在文件的开头。
将所需代码放入一个字符串变量中。在您想要自定义代码的位置,将有%s。之后,只需使用phpMIME类型进行响应。
例如;
$phpCode = "if (foo == blah) { lala lala + 4; %s = 5; }", $user_specific_variable;
header('Content-type: text/php');
echo $phpCode;
沃伊拉。
NB:也许哑剧类型不对,我在这里说得太离谱了。
我认为不应该在"a+"模式下打开文件,而应该在"r+"模式中打开文件,因为"a"总是附加到文件后面。但我认为写入无论如何都会覆盖您当前的数据。因此,我们的想法是,从您打算写入EOF的位置开始,您需要缓冲文件。然后加上你的行,然后加上缓冲的内容。
另一种方法可能是在PHP文件中保留一些模式,比如#######。然后,您可以:1.复制原始PHP脚本2.使用file_get_contents()将完整的PHP脚本读取到单个变量中,比如$fileContent3.使用str_replace()函数将$fileContent中的#######替换为所需的用户ID4.以"a"模式打开复制的PHP脚本,并将$fileContent重写到其中。