(PHP) 存储点击的IP地址
(PHP) storing IP address of clicks
经过将近 3 天的故障排除,我必须寻求建议。
A 有一个带有 4 个图像和 4 个 'like' 按钮的小图像板。早些时候我做到了,所以每个按钮的点击次数存储在一个 .txt 文件中。现在我基本上需要让一个人可以按某个按钮一次。
这是ip.txt
。左边的数字是按钮 ID,右边的数字是点击那个按钮的人的 IP。
click-001||127.0.0.1
click-002||
这个很简单。我需要确保它在我点击我的 PC 时存储 ip,然后在我点击我的 pad 时存储另一个 IP - 并停止 无论我接下来做什么。现在最近几天它一直在做除此之外的任何事情!
我当前的代码 isset
。看到第一个 IP 但没有添加第二个:
$file2 = 'ip.txt'; // path to text file that stores counts
$fh2 = fopen($file2, 'r+');
$ip_addr = $_SERVER['REMOTE_ADDR'];
$lines2 = '';
while(!feof($fh2)) {
$line2 = trim(fgets($fh2));
if ($line2) {
$line2 = explode('||', $line2);
if(isset($line2[0], $line2[1])) {
$item2 = trim($line2[0]);
if(!empty($item2)) {
if($item2 == $id) {
if(empty($line2[1])) {
$lines2 .= "$item2||$ip_addr\r\n";
file_put_contents($file2, $lines2);
} else {
// this is where it always fails
if (!isset($ip_addr)) { $ip_all = $line2[1] . " " . $ip_addr;
$lines2 .= "$item2||$ip_all\r\n";
file_put_contents($file2, $lines2);
} else {
echo "lul";
}
}
}
}
}
}
}
fclose($fh2);
我也用 in_array
函数试过这个:
$ip_all = array($line2[1]);
if (!in_array($ip_addr, $ip_all)) {
array_push($ip_all, ',' , $ip_addr);
$ip_fin = implode($ip_all);
$lines2 .= "$item2||$ip_fin\r\n";
file_put_contents($file2, $lines2);
^这个也看到了第一个IP并添加了第二个,但是后来找不到IP是否已经存在,点击时一直添加副本。
这太残酷了。我做错了什么,有没有更简单的方法?
最佳方法:使用数据库或使用XML(XML有非常有用的库)
文本文件方法:
获取文件并编辑...
$id = "...";
$ip="...";
$file2 = file('ip.txt');
$file2 = array_map(
function($current_line) use ($id,$ip) {
$current_line = explode('||', $current_line);
if($current_line[0] == $id){
$current_line[]=$ip;
}
return join("||",$current_line);
},$file2
);
file_put_contents('ip.txt', implode('\n', $file2));
使用 MySQL 数据库完成此操作。
使用文本文件效率极低,并且当多个用户同时点赞时可能会导致冲突!
每次用户单击'Like'按钮时将IP插入数据库,然后使用select查询来确定该IP之前是否喜欢过该图片。
我不建议只使用 IP,因为某些 ISP 会提供每隔几秒更改一次 IP (Public IP) 地址的动态 IP。
使用 cookies 为用户存储一个唯一的 cookie(如果他们没有登录)或者只要求用户在投票前先登录!
关于 MySQL Insert 和 Select 的信息在 Google 上随处可见。
这是一个:https://www.w3schools.com/sql/
经过将近 3 天的故障排除,我必须寻求建议。
A 有一个带有 4 个图像和 4 个 'like' 按钮的小图像板。早些时候我做到了,所以每个按钮的点击次数存储在一个 .txt 文件中。现在我基本上需要让一个人可以按某个按钮一次。
这是ip.txt
。左边的数字是按钮 ID,右边的数字是点击那个按钮的人的 IP。
click-001||127.0.0.1
click-002||
这个很简单。我需要确保它在我点击我的 PC 时存储 ip,然后在我点击我的 pad 时存储另一个 IP - 并停止 无论我接下来做什么。现在最近几天它一直在做除此之外的任何事情!
我当前的代码 isset
。看到第一个 IP 但没有添加第二个:
$file2 = 'ip.txt'; // path to text file that stores counts
$fh2 = fopen($file2, 'r+');
$ip_addr = $_SERVER['REMOTE_ADDR'];
$lines2 = '';
while(!feof($fh2)) {
$line2 = trim(fgets($fh2));
if ($line2) {
$line2 = explode('||', $line2);
if(isset($line2[0], $line2[1])) {
$item2 = trim($line2[0]);
if(!empty($item2)) {
if($item2 == $id) {
if(empty($line2[1])) {
$lines2 .= "$item2||$ip_addr\r\n";
file_put_contents($file2, $lines2);
} else {
// this is where it always fails
if (!isset($ip_addr)) { $ip_all = $line2[1] . " " . $ip_addr;
$lines2 .= "$item2||$ip_all\r\n";
file_put_contents($file2, $lines2);
} else {
echo "lul";
}
}
}
}
}
}
}
fclose($fh2);
我也用 in_array
函数试过这个:
$ip_all = array($line2[1]);
if (!in_array($ip_addr, $ip_all)) {
array_push($ip_all, ',' , $ip_addr);
$ip_fin = implode($ip_all);
$lines2 .= "$item2||$ip_fin\r\n";
file_put_contents($file2, $lines2);
^这个也看到了第一个IP并添加了第二个,但是后来找不到IP是否已经存在,点击时一直添加副本。
这太残酷了。我做错了什么,有没有更简单的方法?
最佳方法:使用数据库或使用XML(XML有非常有用的库)
文本文件方法:
获取文件并编辑...
$id = "...";
$ip="...";
$file2 = file('ip.txt');
$file2 = array_map(
function($current_line) use ($id,$ip) {
$current_line = explode('||', $current_line);
if($current_line[0] == $id){
$current_line[]=$ip;
}
return join("||",$current_line);
},$file2
);
file_put_contents('ip.txt', implode('\n', $file2));
使用 MySQL 数据库完成此操作。
使用文本文件效率极低,并且当多个用户同时点赞时可能会导致冲突!
每次用户单击'Like'按钮时将IP插入数据库,然后使用select查询来确定该IP之前是否喜欢过该图片。
我不建议只使用 IP,因为某些 ISP 会提供每隔几秒更改一次 IP (Public IP) 地址的动态 IP。
使用 cookies 为用户存储一个唯一的 cookie(如果他们没有登录)或者只要求用户在投票前先登录!
关于 MySQL Insert 和 Select 的信息在 Google 上随处可见。
这是一个:https://www.w3schools.com/sql/