PHP - 打开,读取和删除文件中的数据

时间:2011-03-17 16:03:06

标签: php fopen

我有一个名为functions.php的文件。

它包含超过3000行的大量数据。

在此文件中间的某处有代码:

/*****************************************
        My Custom Code 
*****************************************/

if ( function_exists('my_code') )
    my_code(array(
          'name' => 'First instance',
          'description' => 'Hello, hello.',
          ));

if ( function_exists('my_code') )     
    my_code(array(
          'name' => 'Second instance',
          'description' => 'Haha :)', 
          ));

我列出了所有my_code数组,我得到了:

  • 初审
  • 第二实例

现在,我想要实现的是,当用户点击“第一个实例”旁边的X时,PHP在后台打开functions.php文件,找到确切的功能并删除它而不触及任何其他内容。

因此,删除“First Instance”后,functions.php文件应如下所示:

/*****************************************
        My Custom Code 
*****************************************/

if ( function_exists('my_code') )     
    my_code(array(
          'name' => 'Second instance',
          'description' => 'Haha :)', 
          ));

知道怎么做到这一点?我知道如何打开文件,写入,删除,但我不知道如何消灭不仅仅是一行而是几行? :)

2 个答案:

答案 0 :(得分:0)

如果您的代码始终采用您所描述的格式,则可以从文件中读取每5行,如果它是您要保留的实例,则将它们输出为字符串。然后将字符串写回原始文件。

但是,是的,代码修改代码是PAIN。将实例存储在数据库或格式化文件等数据结构中要好得多。

答案 1 :(得分:0)

我认为最好的方法是打开文件并遍历这些行。您需要匹配函数的每一行,或者您需要匹配第一行并跟踪打开和关闭括号{ }的数量,以便知道何时到达它的末尾。

如果某行不匹配,则将其写入新文件。如果确实匹配则忽略它。然后最后你进行系统调用以对新文件进行语法检查(如果你的行匹配出错了):

system( "php -l newfile.php", &$retval );

然后检查返回值$retval以确保它没问题(它将完全等于0)。如果没问题,那么用你的新文件覆盖functions.php。

if( $retval === 0 ) {
     // the syntax is good 
     rename( "newfile.php", "functions.php");
}

您需要为此设置适当的路径。

现在所有这些都说,这不是一个好主意,我建议你不要实施它。更好的方法是将您的功能分解为单独的文件。然后使用INI配置文件或数据库来跟踪应加载的内容。其中任何一个都有能力进行编辑。即使是文本数据文件也比使用实际代码更好。

一旦你知道你应该加载什么,那么在开始时需要或包含适当的文件。

以下是使用数据库执行此操作的简单示例:

$res = mysql_query("SELECT file_name FROM load_functions");
if( mysql_error() ) {
     // do something because the query failed
}
else {
     while( list($file_name) = mysql_fetch_row($res) ) {
          if( file_exists($file_name) ) {
               require_once( $file_name );
          }
          else {
               // warn because a file requested didn't exist
          }
     }
}

希望有所帮助