2012-01-30 42 views
1

好吧,我得到了一个Minecraft服务器,我正在为它做一个投票脚本。PHP/MYSQL IP检查/记录器

我需要一种方法来检查mySQL中的用户ip。 如果它不存在,它会将IP放入数据库中,并在数据库中24小时后将其删除。

如果有人可以帮助我做到这一点,将是巨大的,感谢

回答

1

有很多教程在线就如何实现这一目标,因此我不会给你的代码。只是一些提示,让你开始。

在PHP中,你可以从$_SERVER超全局

$ip = $_SERVER['REMOTE_ADDR']; 

得到用户的IP地址,以检查它是否在你的表中存在

$query = sprintf("SELECT COUNT(*) FROM yourtable WHERE `ip` = '%s'", mysql_real_escape_string($ip)); 

如果它不存在,其存储使用INSERT命令以及时间戳。

至于在24小时后删除,您可以设置一个cron作业,该作业每隔一小时左右运行一次,并删除所有已过期的条目。但是,不删除条目会更容易。相反,当用户投票时,只需检查他最后一次投票的时间戳即可。如果自上次投票24小时后,只需更新时间戳。

基本上,工作流程将是:

1. Get users's IP address. 
2. Does this IP exist in table? 
    2a. If no, let user vote, and enter his ip in the table along with the current time in the timestamp column 
    2b. If yes, get the timestamp of his last vote. Has it been 24 hours since his last vote? 
    2b.a. If yes, let user vote and update timestamp column with current time. 
    2b.b. If no, do not let user vote/reject his vote. Leave timestamp column unchanged. 
+0

为什么你要转义IP地址? – Cheery 2012-01-30 07:42:19

+0

我对此不完全确定,但如果客户端从浏览器外部发出请求(如telnet),客户端可能会为'用户代理'输入'REMOTE_ADDR'的自定义值, 。因为我不确定,我觉得它更安全,只是逃脱它 – xbonez 2012-01-30 07:47:31

+0

嗯......我很困惑这里,即时通讯相当新的PHP,你能帮我多一点 – 2012-01-30 07:47:35

0

最简单的方法是做到以下几点

$ip = $_SERVER['REMOTE_ADDR']; 
// Run cleanup for given IP 
$result = mysql_query("SELECT * FROM table 
      WHERE `ip`='$ip' AND `timestamp` > NOW() - 24*3600"); 
if (mysql_num_rows($result)==0) 
// there is no record within the last 24h, let insert a new one 
{ 
mysql_query("INSERT INTO table SET `ip`='$ip', `timestamp` = NOW()"); 
echo "Thank you for your vote!"; 
} 
else echo "You may vote only once in 24 hours"; 
// run total cleanup query from time to time 
if (rand(1,5)<2) mysql_query("DELETE FROM table 
          WHERE `timestamp` < NOW() - 24*3600"); 

PS:如果你有不同的分组表决,他们每个人都应该有不同的唯一ID。例如,在两列iptimestamp之前的MySQL表格应该有多列voteid。在这种情况下,上面的代码将更改为

// voteid should be somehow set to the id of the voting. 
// for example by GET request 
$voteid = intval($_GET['voteid']); 
$ip = $_SERVER['REMOTE_ADDR']; 
// Run cleanup for given IP 
$result = mysql_query("SELECT * FROM table 
    WHERE `ip`='$ip' AND `voteid`='$voteid` AND `timestamp` > NOW() - 24*3600"); 
if (mysql_num_rows($result)==0) 
// there is no record within the last 24h, let insert a new one 
{ 
    mysql_query("INSERT INTO table SET `ip`='$ip', 
       `voteid`='$voteid', `timestamp` = NOW()"); 
    echo "Thank you for your vote!"; 
} 
    else echo "You may vote only once in 24 hours"; 
    // run total cleanup query from time to time 
if (rand(1,5)<2) mysql_query("DELETE FROM table 
           WHERE `timestamp` < NOW() - 24*3600"); 
+0

那么,我在哪里把数据库信息?我有一个准备去 – 2012-01-30 07:54:24

+0

@ user1177550你是什么意思的数据库信息?连接到MySQL服务器还是什么? – Cheery 2012-01-30 07:56:29

+0

另外,他们投票时有多个投票站点。我怎么能使这个效果一个投票站点。所以他们可以每个投票站点每24小时投票,如果你明白我的意思? – 2012-01-30 07:59:00