我想让我的用户下载.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);
}
你会做什么?
答案 0 :(得分:1)
a +模式意味着:
'a +'开放阅读和写作;将文件指针放在文件的末尾。如果该文件不存在,请尝试创建它。
你可能想要r +
'r +'开放阅读和写作;将文件指针放在文件的开头。
答案 1 :(得分:1)
在fopen()中附加模式+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个字节的输出,现在你已经在原始文件中删除了一个字节,并且可能有一个损坏的文件。
答案 2 :(得分:1)
将您想要的代码放在一个字符串变量中。您希望自定义代码的位置为%s。之后只需回复php MIME类型。
例如;
$phpCode = "if (foo == blah) { lala lala + 4; %s = 5; }", $user_specific_variable;
header('Content-type: text/php');
echo $phpCode;
瞧。
注意:也许mime类型不正确,我在这里说出我的屁股。
答案 3 :(得分:0)
我认为不是以“a +”模式打开文件,而是应该以“r +”模式打开文件,因为“a”总是附加到文件中。但我认为写入会反正覆盖您当前的数据。因此,我们的想法是,您需要缓冲文件,从您打算写入EOF的位置开始。然后添加你的行,然后添加你已经缓冲的行。
另一种方法可能是在PHP文件中保留一些模式,例如######。然后你可以: 1.复制原始PHP脚本 2.使用file_get_contents()将完整的PHP脚本读入单个变量,例如$ fileContent 3.使用str_replace()函数将$ fileContent中的######替换为所需的用户ID 4.以“a”模式打开复制的PHP脚本,并将$ fileContent重写为它。