如何在x秒前检测是否已将行插入数据库

时间:2011-12-27 23:54:47

标签: php sql time spam

基本上,我正在研究垃圾邮件检测系统,我想检测是否在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';
    }

如果你们中的任何一个人能指出我在这里正确的方向,我显然是不正确的,所以任何帮助都非常感激。

3 个答案:

答案 0 :(得分:3)

您需要在该表中插入行时设置的时间戳字段(可以是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

答案 1 :(得分:1)

将时间戳插入数据库,然后当您从用户接收输入时,抓住时间戳并检查他们的上次发布时间加上X秒(或节流,可能是更好的词)是否小于或等于到当前的时间戳。

这是一个伪代码示例:

X = post_limit;
if((last_post_time + X) <= current_time)
{
    allow_to_post;
}
else
{
    do_not_allow_to_post;
}

以下是我在我的图片板软件中使用的一段代码,可能也指向正确的方向:

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

答案 2 :(得分:0)

您的表格应该有inserted_at类型的列(我们称之为timestamp)。您插入的查询将如下所示:

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
}