В основном, я работаю над системой обнаружения спама, и я хотел бы определить, была ли строка вставлена меньше 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'; }
Если кто-то из вас может указать мне в правильном направлении здесь, я, очевидно, не прав, поэтому любая помощь очень ценится.
В этой таблице вам нужно поле timestamp (может быть типа 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; }
Вот фрагмент кода, который я использовал в своем программном обеспечении для рисования, которое также может указывать вам в правильном направлении:
<?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); } ?>
В таблице должен быть столбец (мы будем называть его 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 }