(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);
?>
抱歉不得不问。 简而言之,我正在制作一个简单的图像板,每个图像都有一个 "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);
?>