Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP在文件中动态插入行_Php_File - Fatal编程技术网

使用PHP在文件中动态插入行

使用PHP在文件中动态插入行,php,file,Php,File,我想让我的用户可以下载一个.php文件 每个文件都因用户而异: 在第20行,我定义了一个等于用户ID的变量 为此,我尝试了以下方法:复制原始文件。读到第19行(fgets),然后fputs一行PHP代码,然后提供文件供下载 问题是,该行不是插入到第19行之后,而是插入到.php文件的末尾。代码如下: if (is_writable($filename)) { if (!$handle = fopen($filename, 'a+')) { echo "Cannot o

我想让我的用户可以下载一个.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);
}
if(可写($filename)){
如果(!$handle=fopen($filename,'a+')){
echo“无法打开文件($filename)”;
出口
}
对于($i=1;$i而言,a+模式意味着:

“a+”打开以进行读取和写入;将文件指针放在文件的末尾。如果文件不存在,请尝试创建它

你可能想要一个r+


“r+”打开以进行读取和写入;将文件指针放在文件的开头

在fopen()中附加模式
+a
,将句柄指针放在文件的末尾。fgets()循环将失败,因为在文件末尾没有任何内容可读取。您基本上正在执行19次无操作。然后,您的fwrite将在文件末尾输出新值,如预期的那样

要执行插入操作,需要将句柄指向开头,然后执行fgets()循环

然而,如果你只是想让人们得到这个修改过的文件,为什么还要费心做“打开文件、扫描、写入更改、提供文件”?这会在你的系统上留下大量几乎重复的文件。更好的方法是将文件分为两部分,然后你可以做一个简单的操作:

readfile('first_part.txt');
echo "The value you want to insert";
readfile('last_part.txt');

这样您就不必每次都保存“新”文件。这还允许任意长度的插入。您的fwrite方法可能会破坏文件的后续部分。例如,扫描偏移量为“10”然后写出4个字节,这将替换原始文件中该位置的原始4个字节。在某些情况下,它可能会变成5个字节的输出,而现在您在原始文件中丢弃了一个字节,并且可能有一个损坏的文件。

将所需的代码放在一个字符串变量中。此时,您将有%s,在您想要自定义代码。然后用php MIME类型响应

eg


注意:可能mime类型不正确,我在这里说的是胡说八道。

我认为不应该以“a+”模式打开文件,而应该以“r+”模式打开文件,因为“a”始终附加到文件。但我认为写入操作无论如何都会覆盖您当前的数据。因此,我们的想法是,您需要缓冲文件,从您打算写入的位置到EOF。然后添加行,后跟您缓冲的内容

另一种方法可能是在PHP文件中保留一些模式,如######。然后您可以: 1.复制原始PHP脚本 2.使用file_get_contents()将完整的PHP脚本读入单个变量,比如$fileContent 3.使用str_replace()函数将$fileContent中的######替换为所需的用户ID
4.在“a”模式下打开复制的PHP脚本,并将$fileContent重写到其中。

该死,这样做效果更好,但仍然有效:它写在正确的位置,但每个新字符都会擦除一个旧字符,而不是实际插入它(编辑:好,我需要为我的写入留出空间)脚本很长,我不知道把它作为一个字符串放在一个变量中,然后从文件加载到一个变量中,然后在完成后取消设置是否明智。比在硬盘上写乘法快得多。
$phpCode = "if (foo == blah) { lala lala + 4; %s  = 5; }", $user_specific_variable;
header('Content-type: text/php');
echo $phpCode;