使用PHP在文件中即时插入行

时间:2011-06-14 14:35:48

标签: php file

我想让我的用户下载.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);
}

你会做什么?

4 个答案:

答案 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重写为它。