为什么这个PHP代码在打开时会覆盖文件内容?

时间:2013-05-01 02:24:57

标签: php

我使用此功能编写了一些非常复杂的PHP应用程序,所以我不确定这里发生了什么。

我正在编写一个使用在线历史记录来保存内容的应用程序(通过ajax get)。我编写的用于将用户的历史存储到文件的API非常简单:

$myFile = "./snhistory/".$_GET["uid"];
$stringData = urldecode($_GET["name"])."\n";
$file = fopen($myFile,"a");
fwrite($file,$stringData);
fclose($file);

这类似于将name中找到的数据添加到文件末尾的新行的代码,对吧?好吧,这不是PHP看到它的方式。它添加了一个名称,然后当我使用不同的名称运行代码时,它会覆盖第一个,只显示第二个。我尝试过任何我能想到的事情:

 file_put_contents($myFile,file_get_contents($myFile).$stringData);

 file_put_contents($myFile,$stringData,FILE_APPEND);

并且

fopen($myFile,"w");
fseek($file,0,SEEK_END);

所有产生相同的行为。这是PHP的错误还是我错过了什么?我觉得如果代码中有问题,我尝试的第二件事就是修复它。但我不确定,这就是为什么我在这里问所有人。

我真的很感激可以提供的任何帮助。

编辑:根据答案,字符串的问题是它们包含像'这样的标点符号,并且由于某种原因,url编码和转义不起作用。阅读答案的编辑以获得最终答案。

2 个答案:

答案 0 :(得分:1)

尝试在您的计算机上运行以下代码:

<?php
$myFile = "./myfile.txt";
$myString="hello world\n";
$fp = fopen($myFile, "a");
fwrite($fp, $myString);
fclose($fp);
?>

我第一次运行它(从命令行使用php app.php,它会创建一个文件,其中包含一个“hello world”行。

再次运行它,有两行。再次,有三个......

这是对基本php安装的一个很好的测试。如果这种方法有效,但你的问题仍然存在,那么你所使用的变量就会让你感到烦恼 - 或者对目录的权限等等。这不是一个完整的解决方案 - 但是有些东西可以帮助你缩小范围,也许呢? / p>

修改 基于我们在评论中的讨论,似乎这种行为的来来往往取决于(URL编码)变量($_GET("name"))的内容,并且解决方案是“清理”变量 - 获取摆脱任何“坏”字符会导致这种覆盖行为。我正在将这些信息添加到答案中,以便人们不必赘述 - 如果您提供有关确切的字符串内容使行为出现的详细信息,那么对社区有帮助。

答案 1 :(得分:0)

问题确实可能是行结束。当你在Windows中type一个文本文件时,如果你一直在使用LF而不是CRLF,那么控制台输出将继续用下一行覆盖每一行。测试它的一个好方法是在Notepad ++等编辑器中打开文件。

如果使用\ n而不是\ r,则会在linux上发生同样的问题。然后cat将继续输出到同一行。所以,问题是你的行结尾,而不是你的文件写命令。