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

Osm*_*USA 5 php

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

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

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

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

 file_put_contents($myFile,file_get_contents($myFile).$stringData);
Run Code Online (Sandbox Code Playgroud)

 file_put_contents($myFile,$stringData,FILE_APPEND);
Run Code Online (Sandbox Code Playgroud)

fopen($myFile,"w");
fseek($file,0,SEEK_END);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Flo*_*ris 1

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

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

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

再次运行,出现两行。再说了,还有三个……

这是对你的基本 php 安装的一个很好的测试。如果这有效,但您的问题仍然存在,那么您正在使用的变量或目录权限等问题会让您感到困惑。这不是一个完整的解决方案 - 但也许可以帮助您缩小范围?

编辑 根据我们在评论中进行的讨论,似乎这种行为的出现和消失取决于(URL编码)变量($_GET("name"))的内容,解决方案是“清理”变量 - 摆脱任何“ bad”字符会导致这种覆盖行为。我将此信息添加到答案中,以便人们不必费力地阅读答案 - 如果您提供有关具体字符串内容使行为出现的详细信息,这将对社区有所帮助。