Блокированное удаление пользователей
Как массово удалить спамеров, которые регистрируются на форумах для индексации поисковиками ссылок на их сайт ?
Жаль, что flowBB не позволяет модулировать доступ к информации о пользователях в соответствии с их стажем.

Первый ответ на спам очень прост: Спам уже становится бесполезным, если файл robots.txt запрещает поисковикам доступ к профилям:
disallow:/forum/profile.php
disallow:/forum/userlist.php
Затем время от времени нужно будет очистить базу данных от ненужных регистраций, все спамеры, чьи сообщения были стерты или не разместили сообщения.
Но это не так просто: между таблицами базы существуют множественные отношения и если удалить запись в одной из них, то нужно удалить и все ссылки на эту запись.
Таблицы flowBB и зарегистрированные участники
Итак, мы увидим все таблицы и столбцы, относящиеся к пользователям.
пользователи
id: идентификатор, сохраненный в других таблицах.
username: имя в других таблицах.
num_posts: количество сообщений.
изгнания
username: пользователя можно запретить, запись в bans тоже нужно удалить .
перенесения
reported_by: (id) для маловероятного случая, когда спамер сделал бы отчет.
подподписи
user_id: (id) в случае, если спамер согласился бы с этой нитью обсуждения .
Запрос на запрос
Из интерфейса PHPMyAdmin или любого другого интерфейса в SQL уже можно увидеть, сколько неактивных пользователей:
SELECT username FROM users WHERE num_posts='0' AND username != 'Guest'
Замените пользователей на xxxusers, если в конфигурации .php объявлен префикс xxxx.
Исключается Guest, который является общим именем гостей в английской версии. Это может быть другое имя в вашей версии, проверьте в списке пользователей для id 1.
На самом деле необходимо сохранить пользователя с идентификатором 1.
Просмотр пользователей без сообщений :
SELECT * FROM bans, users WHERE bans.username=users.username AND users.num_posts='0'
Другая формулировка, пригодная для исключения:
SELECT * FROM bans WHERE username IN (SELECT username FROM users WHERE num_posts='0')
Для удаления вместо SELECT * будет использоваться DELETE.
Запрос на удаление
Пользователи без сообщений удаляются с помощью этой команды SQL:
DELETE FROM $usertable WHERE num_posts='0' AND username != 'Guest'
Важно: Во франкоязычной версии заменить гостя на гостя. У него номер 1 .
Но сначала мы должны исключить ссылки:
DELETE FROM bans WHERE username IN (SELECT username FROM users WHERE num_posts='0')
DELETE FROM reports WHERE reported_by IN (SELECT id FROM users WHERE num_posts='0')
DELETE FROM subscriptions WHERE user_id IN (SELECT id FROM users WHERE num_posts='0')
Можно просто сначала проверить ссылки и сделать простое удаление, если их нет.
Создать сценарий
Во второй части представлен PHP-скрипт для размещения на сайте и выполнения операции автоматически.
Спамер определяется как пользователь, регистрирующийся для добавления своего профиля, со ссылкой на возможно сомнительный сайт, который никогда не добавлял билет или чьи билеты являются спамами и были удалены.
Скрипт более сложен, чем простая команда SQL, так как будет тестировать таблицу сообщений, чтобы убедиться, что пользователь их не размещал, и не просто просматривать количество сообщений в таблице пользователей.
Последняя действительно не обновляется потоком BB после удаления билета. Это односторонний счетчик!
Больше таблиц flowBB
Помимо таблиц, описанных в первой части, на этот раз мы будем использовать таблицу сообщений.
Таблица сообщений:
постер | poster_id | ||||
ник пользователя | его идентификационный номер |
Нужно только проверить, нет ли у пользователя билетов.
Таблица по теме:
постер | ||||
ник пользователя |
Обычно топика удаляется при удалении первого поста, и мы не будем использовать эту таблицу.
Запрос
Повторяем запросы, данные в первой части, и добавляем обработку для таблицы сообщений.
Проверить количество сообщений для одного пользователя (мы проведем тест для всех пользователей на самом деле):
$user = "xxxx";
$query = SELECT * WHERE poster='$user'
$hnd = mysqli_query($db_handler, $query);
if(mysqli_num_rows($hnd) == 0)
{
echo "$user n'a aucun message.<br>";
}
Если количество сообщений равно нулю, можно обновить количество билетов в таблице пользователей:
UPDATE users SET num_posts='0' WHERE poster='$user'
Затем в сценарий добавляются запросы на удаление, видимые в первой части, которые основаны на таблице пользователей и связанных таблицах :
DELETE FROM bans WHERE username IN (SELECT username FROM users WHERE num_posts='0')
DELETE FROM reports WHERE reported_by IN (SELECT id FROM users WHERE num_posts='0')
DELETE FROM subscriptions WHERE user_id IN (SELECT user_id FROM users WHERE num_posts='0')
DELETE FROM users WHERE num_posts='0' AND id != '1'
Мы сохраняем запись 1 гостя «Гость» на английском языке, которая всегда должна присутствовать.
Сценарий удаления
include("config.php");
$hnd = mysqli_query($db_handler, "SELECT username FROM users");
while($userlist = mysqli_fetch_assoc($hnd))
{
$user = $userlist['username'];
$hndposts = mysqli_query($db_handler, "SELECT * FROM $posts WHERE poster='$user'");
if(mysqli_num_rows($hndposts) == 0)
{
mysql_query("UPDATE users SET num_posts='0' WHERE username='$user'", $db_handler);
}
}
mysql_query("DELETE FROM bans WHERE username IN (SELECT username FROM users WHERE num_posts='0')", $db_handler);
mysql_query("DELETE FROM reports WHERE reported_by IN (SELECT id FROM users WHERE num_posts='0')", $db_handler);
mysql_query("DELETE FROM subscriptions WHERE user_id IN (SELECT id FROM users WHERE num_posts='0')", $db_handler);
mysql_query("DELETE FROM users WHERE num_posts='0' AND id != '1'", $db_handler);
echo "Done!";
К этому надо добавить код подключения к базе данных, который включен в скрипт для скачивания...
Загрузить и использовать
Для использования скрипта его помещают в корневой каталог flowBB и сразу вызывают файл из браузера.
Например:
http://www.monsiteweb.com/forum/killbill.php
Ты можешь увидеть, что будет делать скрипт, не изменяя ничего, временно включив флаг DEBUG в исходном коде:
$DEBUG = true;
Сценарий массового удаления пользователей flowBB
Файл называется killbill.php. Вы можете изменить это имя и дать ему произвольное имя.
Перед первым использованием необходимо выполнить резервное копирование базы данных с помощью команды экспорта PHPMyAdmin или функции панели администрирования.