我网站上的PHP计数器坏了



所以。我花了很多时间来计算一个特殊的PHP计数器的后勤工作。我花了很多时间、研究和数小时打字,但脚本要么不起作用,要么会返回内部服务器错误。我的脚本应该为文件创建一个文件路径,如果不存在,则读取并写入新计数。我遵循了我的代码知识,然后感到厌倦,开始寻找资源,然后在找到一个成功的脚本后,继续破解它

<?php
// Add correct path to your countlog.txt file.
$path = __DIR__ . '/PathTo/countlog.txt';
if (file_exists($path)) {} else {file_put_contents($path, "New")}
// Opens countlog.txt to read the number of hits.
$file  = fopen( $path, 'r' ) or die("Cannot read file");
$count = fgets( $file, 1000 );
fclose( $file );
// Update the count.
$count = abs( intval( $count ) ) + 1;
// Output the updated count.
echo "$count hitsn";
// Opens countlog.txt to change new hit number.
$file = fopen( $path, 'w' );
fwrite( $file, $count );
fclose( $file );
?>

如果你能帮助我,我将不胜感激。

你到底是什么意思"不工作或将返回内部服务器错误";?你还没有真正说出你的问题所在。错误信息是什么?它在哪一步失败——创建countlog.txt文件并写入";新的";如果它不存在?给出";无法读取文件";fopen((上的错误,或者之后的什么?

我可以猜测一下:

  • 回显$path,查看它实际尝试使用的文件路径。PathTo文件夹是否存在?你有权限写入其中的文件吗?File_put_contents创建了一个不存在但不是目录的文件名。您需要手动创建文件夹,或者在代码中使用mkdir(((file_exists((或is_dir((可以检查文件夹是否存在(
  • 如果脚本创建了您的文件;新的";在其中,$count在下一步中不包含数字,这没有多大意义。尽管按字母顺序排列的字符串的intval((通常会返回0,但这是不可预测的行为。从逻辑上讲,命中计数器应该只从数字0开始(或者1,如果第一次命中没有再次递增的话(,然后从那里开始递增。你也不需要取一个从零开始只上升的命中计数器的绝对值
  • 如果您不知道脚本在哪里失败,请添加一些调试代码。即,如果出现错误,fgets((将返回false。你可以有一个if语句,上面写着";fgets上的错误";如果把问题缩小到这一行是错误的
  • 对于网页点击计数器,您可能希望为结果输出HTML格式。所以echo<br>而不是\n换行

一般来说,您的代码比需要的要长得多,并且有额外的文件操作。您只需要读取该文件一次,然后向该文件写入一次。类似这样的东西:

<?php
$path = __DIR__ . 'PathTocountlog.txt';
if(file_exists($path))
{
$count = file_get_contents($path);
}
else
{
$count = 0;
}
$count++;
file_put_contents($path, $count);
echo "$count hit(s)<br>";
?>

有一些方法可以使其更短,例如使用三元条件运算符而不是长if-else语句,但这段代码更容易理解。如果文件不存在,File_put_contents将产生警告(而不是错误(:您可以在函数调用前用@符号抑制它,或者在else{}块内使用fopen((创建文件。

最新更新