基本上,我正在研究一个垃圾邮件检测系统,我想检测一行是否在x秒前插入。x可以是5秒,所以我想看看一行插入到表中是否少于5秒。
表名可以是my_table
。这就是我想出来的…
$spam_validate = mysql_query("select * FROM my_table WHERE date_time < '3'");
然后输入....
if (mysql_num_rows($spam_validate)==0) {
//keep going
} else {
echo 'Spam was detected';
}
如果你们中有人能指出我正确的方向,我显然是不正确的,所以任何帮助都是非常感激的。
在该表中需要一个时间戳字段(可以是DATETIME类型),在插入行时设置该字段。
INSERT INTO foo (spam, eggs, timestamp) VALUES (42, 88, NOW())
则可以对其进行选择。这个查询应该可以工作。
SELECT * FROM foo WHERE timestamp BETWEEN (NOW() - INTERVAL 5 SECOND) AND NOW()
注意DATETIME算法,它类似于直接使用DATEADD。
在数据库中插入一个时间戳,然后当您接收来自用户的输入时,获取时间戳并检查他们的最后发布时间加上X秒(或者节流,可能会是一个更好的词)是否小于或等于当前时间戳。
下面是一个伪代码示例:X = post_limit;
if((last_post_time + X) <= current_time)
{
allow_to_post;
}
else
{
do_not_allow_to_post;
}
下面是我在imageboard软件中使用的一段代码片段,它可能也会给你指明正确的方向:
<?php
$ip = $_REMOTE['SERVER_ADDR']; // client's IP address
$sql = "SELECT time FROM spam WHERE ip = '$ip' LIMIT 1";
$query = mysql_query($sql);
if(0 < mysql_num_rows($query))
{
while($result = mysql_fetch_assoc($query))
{
if($result['time'] < $time)
{
$sql = "DELETE FROM spam WHERE ip = '$ip'";
$return_val = mysql_query($sql);
}
}
}
else
{
$sql = "INSERT INTO spam (ip,time) VALUES ('$ip','$time');";
$return_val = mysql_query($sql);
}
?>
您的表应该有一个类型为timestamp
的列(我们称之为inserted_at
)。您插入的查询看起来像这样:
INSERT INTO tbl (inserted_at, somecol, someothercol) VALUES (NOW(), 'whatever', 76)
…你的校验码应该是
$interval = 5;
$sql = "SELECT count(*) AS denied FROM tbl WHERE inserted_at > NOW() - $interval";
$spam_validate = mysql_fetch_array(mysql_query($sql));
if ($spam_validate['denied']) {
echo 'Spam was detected';
} else {
// keep going
}