5

我已经使用此功能编写了一些非常复杂的 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 编码和转义不起作用。阅读答案的编辑以获取最终答案。

4

2 回答 2

1

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

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

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

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

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

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

于 2013-05-01T03:11:12.173 回答
0

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

如果您使用 \n 而不是 \r,Linux 上也会出现同样的问题。然后cat将继续输出到同一行。因此,问题在于您的行尾,而不是您的文件写入命令。

于 2013-05-01T11:10:58.840 回答