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

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

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

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

单击按钮会通过 AJAX 启动一个小的 php 代码。 counter.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);

?>  

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

Notice: Undefined offset: 1 in C:\wamp64\www\wogue\counter.php on line 18

我认为脚本 'counter.php' 在 'counter.txt' 中的新字符串上创建了一个空格,因此它无法 'explode' 并因此创建了 [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]);
    }
?>

有什么想法吗?

Trim $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";
}
} 

您正在使用 \r\n 作为 counter.php 中的行分隔符进行编写,并读取仅针对 \n 展开的同一文件。你应该保持一致。

只需删除 \n 就足以避免您看到的额外 "space"。

<?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);

?>