Как я могу определить, была ли строка вставлена ​​в базу данных х секунд назад - PullRequest
0 голосов
/ 28 декабря 2011

По сути, я работаю над системой обнаружения спама и хотел бы определить, была ли строка вставлена ​​меньше, чем х секунд назад. 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 ]

3 голосов
/ 28 декабря 2011

Вам необходимо поле временной метки (может иметь тип 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 голос
/ 28 декабря 2011

Вставьте отметку времени в вашу базу данных, затем, когда вы принимаете ввод от пользователя, возьмите отметку времени и проверьте, меньше или равно ли его время последней публикации плюс 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);
}
?>
0 голосов
/ 28 декабря 2011

Ваша таблица должна иметь столбец (назовем его 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
}
...