我正在尝试为 blueimp.net 的 AjaxChat 编写一个非常基本的注册模块。我有一个写入用户配置文件的脚本。
$userfile = "lib/data/users.php";
$fh = fopen($userfile, 'a');
$addUser = "string_for_new_user";
fwrite($fh, $addUser);
fclose($fh);
但我需要它$addUser
在最后一行之前插入,即?>
我将如何使用 fseek 完成此任务?
如果您始终知道文件以 ?> 结尾,仅此而已,您可以:
$userfile = "lib/data/users.php";
$fh = fopen($userfile, 'r+');
$addUser = "string_for_new_user\n?>";
fseek($fh, -2, SEEK_END);
fwrite($fh, $addUser);
fclose($fh);
r+
为了进一步增强答案:由于以下有关以下说明,您将希望以模式打开文件fseek
:
笔记:
如果您以追加(a 或 a+)模式打开文件,则无论文件位置如何,您写入文件的任何数据都将始终被追加,并且调用 fseek() 的结果将是未定义的。
fseek($fh, -2, SEEK_END)
将位置放在文件末尾,然后向后移动 2 个字节(的长度?>
)
另一种方法是使用SplFileObject 类(从 PHP 5.1 开始可用)。
$userfile = "lib/data/users.php";
$addUser = "\nstring_for_new_user\n";
$line_count = 0;
// Open the file for writing
$file = new SplFileObject($userfile, "w");
// Find out number of lines in file
while ($file->valid()) {
$line_count++;
$file->next();
}
// Jump to second to last line
$file->seek($line_count - 1);
// Write data
$file->fwrite($add_user);
我还没有测试过这个(我不能在我现在使用的电脑上)所以我不确定它是否完全一样。这里的重点是 SplFileObject 的很酷的seek()方法,它可以逐行查找,而不是 fseek() 如何按字节查找。