(PHP、AJAX)简单的计数器。想通了问题,没有解决方案

(PHP, AJAX) Simple counter. Figured the problem, no solution

提问人:Cyril Alekseyev 提问时间:10/2/2018 最后编辑:Cyril Alekseyev 更新时间:10/2/2018 访问量:189

问:

很抱歉不得不问。 简而言之,我正在制作一个简单的图像板,每个图像都有一个“喜欢”按钮。点击次数(点赞数)以以下格式存储在“counter.txt”文件中:

click-001||15
click-002||7
click-003||10

单击按钮可通过 AJAX 启动一个小的 php 代码。计数器 .php:

<?php
$file = 'counter.txt'; // path to text file that stores counts
$fh = fopen($file, 'r+');
$id = $_REQUEST['id']; // posted from page
$lines = '';
while(!feof($fh)){
    $line = explode('||', fgets($fh));
    $item = trim($line[0]);
    $num = trim($line[1]);
    if(!empty($item)){
        if($item == $id){
            $num++; // increment count by 1
            echo $num;
            }
        $lines .= "$item||$num\r\n";
        }
    } 
file_put_contents($file, $lines);
fclose($fh);

?>  

因此,当我运行网站并测试单击我的按钮时,我收到以下消息:

注意:未定义的偏移量:1 在 C:\wamp64\www\wogue\counter.php 在线 18

我认为脚本“counter.php”在“counter.txt”中的新字符串上创建了一个空格,因此它无法“分解”,从而形成[1]索引。我认为的方式是将 .txt 文件中的最后一行空行后退并保存。它没有错误地运行,直到我点击了几次按钮,然后出现了同样的错误。

索引中的代码段如下所示:

<?php 
$clickcount = explode("\n", file_get_contents('counter.txt'));
foreach($clickcount as $line){
    $tmp = explode('||', $line);
    $count[trim($tmp[0])] = trim($tmp[1]);
    }
?>

有什么想法吗?..

PHP ajax 计数器 undefined-index

评论

0赞 user3783243 10/2/2018
为此,您确实应该使用数据库。它会更简单,性能更好。您可以替换为$clickcount = explode("\n", file_get_contents('counter.txt'));$clickcount = file('counter.txt');
0赞 Cyril Alekseyev 10/2/2018
是的,可能。这不是最好的方法。
0赞 user3783243 10/2/2018
与其修改要包含的问题,不如选择其中一个答案,或发布自己的答案。要接受答案,请参阅 meta.stackexchange.com/questions/5234/...solved

答:

0赞 u_mulder 10/2/2018 #1

修剪,如果它不是空的 - 做你需要的:$line

$line = trim(fgets($fh));
if ($line) {
    $line = explode('||', $line);
    $item = trim($line[0]);
    $num = trim($line[1]);
    if(!empty($item)){
        if($item == $id){
            $num++; // increment count by 1
            echo $num;
        }
        $lines .= "$item||$num\r\n";
    }
} 

或者以这种方式检查:empty

$line = explode('||', fgets($fh));
if(!empty(line[0]) && !empty($line[1])){
    if(line[0] == $id){
        $line[1]++; // increment count by 1
        echo $line[1];
    }
    $lines .= "{$line[0]}||{$line[1]}\r\n";
}
} 

评论

0赞 Cyril Alekseyev 10/2/2018
谢谢。/解决。
0赞 Diogo Sgrillo 10/2/2018 #2

您正在使用行分隔符进行写入,并读取仅针对 的同一文件。你应该保持一致。\r\ncounter.php\n

只需删除就足以避免您看到的额外“空间”。\n

<?php
$file = 'counter.txt'; // path to text file that stores counts
$fh = fopen($file, 'r+');
$id = $_REQUEST['id']; // posted from page
$lines = '';
while(!feof($fh)){
    $line = explode('||', fgets($fh));
    $item = trim($line[0]);
    $num = trim($line[1]);
    if(!empty($item)){
        if($item == $id){
            $num++; // increment count by 1
            echo $num;
            }
        $lines .= "$item||$num\n"; //removing the \r here
        }
    } 
file_put_contents($file, $lines);
fclose($fh);

?>