SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.07.2018 17:40:26

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Защита от одинаковых сообщений

Добрый день!
Появилась необходимость поставить защиту от спамеров, которые рассылают одинаковые сообщения другим пользователям на сайте.
В моем случае в тексте спамеров обязательно присутствует email адрес и соответственно @

Логически я это вижу так:
если последние пять сообщений (message) от этого пользователя (id_otp) одинаковые  и в них есть знак @, то не даем пользователю отправить сообщение, т.е. не добавляем запись в таблицу (messages)

структура таблицы

id
id_otp
id_pol
messages
date

Помогите составить запрос на такую проверку

Неактивен

 

#2 16.07.2018 09:19:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5829

Re: Защита от одинаковых сообщений

попробуйте:

select 'ахтунг, спамер!' from
(select messages from messages where id_otp = 'проверяемый пользователь' order by `date` desc limit 5) t
where locate('@', messages) group by messages having count(*)=5;

Неактивен

 

#3 19.07.2018 22:39:02

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Защита от одинаковых сообщений

Спасибо за ответ, хотя я правда до конца не пойму для себя какой именно должен быть алгоритм защиты.
Я немного ошибся и переделал это в своем запросе
Таблица - messages
А ячейка с сообщениями - message

Только я не понял что нужно подставить вместо 'ахтунг, спамер!'?

$result_spam = mysql_query("select 'ахтунг, спамер!' FROM (select `message` FROM `messages` where `id_otp` = '{$myrow_user['id']}' order by `date` desc limit 5) t where locate('@', message) group by message having count(*)=5;",$db);
$myrow_spam = mysql_fetch_array($result_spam);


Судя из этого запроса, я понимаю что, если пользователь введет 5 одинаковых сообщений подряд где будет символ @, то дальше он вообще не сможет ничего другого отправить!? а нужно что бы он смог отправить только другое сообщение, которое отличаеться от предыдущих пяти...
И как вообще проверить такой запрос?
if ($myrow_spam["message"] == $message)
{
    $error = "yes";
}

Отредактированно serj011 (19.07.2018 22:49:50)

Неактивен

 

#4 20.07.2018 01:58:04

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5829

Re: Защита от одинаковых сообщений

serj011 написал:

Только я не понял что нужно подставить вместо 'ахтунг, спамер!'?

без разницы, обычно пишут 1
нужно проверить какой результат вернет запрос: пустой (не спамер) или нет (спамер), используйте mysql_num_rows

Неактивен

 

#5 20.07.2018 08:30:39

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Защита от одинаковых сообщений

$result_spam = mysql_query("select '1' FROM (select `message` FROM `messages` where `id_otp` = '{$myrow_user['id']}' order by `date` desc limit 3) t where locate('@', message) group by `message` having count(*)=3",$db);
if (mysql_num_rows($result_spam) == 1) {

echo "Спамер";

} else {

echo "НЕ Спамер";

}


Спасибо, все работает, но логически наверное мне не подойдет. Так как я хотел изначально при таком запросе, если пользователь отправил последние 3 сообщения подряд одинаковые, и там была @, то пользователь вообще не сможет отправить никаких сообщений больше.

А можно ли как то переделать запрос ИЛИ ПРОВЕРКУ, если четвертое сообщение, такое же как и предыдущие три (либо последнее соответственно), то не даем отправить, а если другое, то даем?

Неактивен

 

#6 20.07.2018 08:42:16

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Защита от одинаковых сообщений

Я совместил две проверки, получилось вот так

$result_spam = mysql_query("SELECT `message` FROM `messages` WHERE `id_otp` = '{$myrow_user['id']}' order by `date` desc limit 1",$db);
$myrow_spam = mysql_fetch_array($result_spam);

$result_spam_n = mysql_query("select '1' FROM (select `message` FROM `messages` where `id_otp` = '{$myrow_user['id']}' order by `date` desc limit 3) t where locate('@', message) group by `message` having count(*)=3",$db);

if ((mysql_num_rows($result_spam_n) == 1) && ($myrow_spam["message"] == $message))
{
    $log .= "Спамер";
    $error = "yes";
}


Так нормально или его можно как то упростить?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson