Перейти к содержанию

Пересчитываем всю статистику форума [restatic.php]


Рекомендуемые сообщения

Всем привет. 

Как вы знаете, на форуме нет возможности пересчитать все сообщения в темах и пересчитать количество тем во всех разделах.
Иногда, при некоторых манипуляциях, эти счетчики сбиваются и вернуть их в актуальное состояние - довольно трудоёмкий процесс.
Единственное, что можно сделать через Админцентр, это пересчитать количество сообщений пользователя (или всех пользователей) и пересчитать их репутацию.

Пошарив немного по интернету, я решил написать свой собственный php-скрипт и как всегда поделиться им с вами бесплатно.

На данный момент скрипт умеет (v0.1 - 17.11.2016):

  • Пересчитывать количество сообщений в каждой теме;
  • Пересчитывать количество тем в каждом разделе;
  • Пересчитывать количество сообщений у каждого пользователя (то, что можно сделать через админцентр);
  • Отображает общее количество одобренных сообщений на форуме;
  • Отображает общее количество утвержденных тем на форуме.

Пересчитывать репутацию он не умеет, я пока не могу найти способа этого сделать, всё что удаётся извлечь из базы, это текущую репутацию.
Сообщения и темы, находящиеся в архиве он тоже не считает.

Установка:
Скачайте файл restatic.php из этого сообщения в корень вашего сайта, настройте (указав параметры подключения к БД) и запустите в адресной строке браузера по пути: http://ваш_сайт.ru/restatic.php

Процесс выполнения скрипта может занимать от пары секунд, до пары минут, в зависимости от объёма данных в вашей базе.

Если файл во вложении больше недоступен, можете создать в корне сайта пустой файл restatic.php и скопировать туда следующее содержимое:

Спойлер

<!DOCTYPE html>
<html>
<head>
  <META content="text/html; charset=utf-8" http-equiv="Content-Type">
  <title>ReStatic v0.1 (17 nov 2016) - [email protected]</title>
</head>
<body>
<?php
//Настройки подключения к вашей БД
mysql_connect("****", "****", "****");	//хост_бд, имя_пользователя_бд, пароль_пользователя_бд
mysql_select_db("****");	//имя_бд
mysql_query  ("set_client='utf8'");
mysql_query  ("set character_set_results='utf8'");
mysql_query  ("set collation_connection='utf8_general_ci'");
mysql_query  ("SET NAMES utf8");

//Количество сообщений в каждой теме
$sql1 = "UPDATE forums_topics LEFT JOIN (
	SELECT topic_id, count(0) AS messages_cnt
	FROM forums_posts WHERE queued=0
	GROUP BY topic_id
	) msg_cnt ON topic_id = forums_topics.tid
	SET posts = coalesce(messages_cnt, 0)";
$result1 = mysql_query($sql1) or die(mysql_error());

if ((isset($result1)) AND ($result1 != "")) 
	{
		echo "<span style=\"color: green;\">Количество сообщений в каждой теме <strong>успешно</strong> пересчитано.</span><br />";
	}
	else
	{
		echo "<span style=\"color: red;\">Количество сообщений в каждой теме <strong>не удалось</strong> пересчитать.</span><br />";	
	}

//Количество тем в каждом разделе
$sql2 = "UPDATE forums_forums LEFT JOIN (
    SELECT forum_id, count(0) AS topics_cnt, sum(posts) AS msg_cnt
    FROM forums_topics WHERE approved=1
    GROUP BY forum_id
	) msg_cnt ON forum_id = forums_forums.id
	SET topics = coalesce(topics_cnt, 0),
    posts = coalesce(msg_cnt, 0)";
$result2 = mysql_query($sql2) or die(mysql_error());

if ((isset($result2)) AND ($result2 != "")) 
	{
		echo "<span style=\"color: green;\">Количество тем в каждом разделе <strong>успешно</strong> пересчитано.</span><br />";
	}
	else
	{
		echo "<span style=\"color: red;\">Количество тем в каждом разделе <strong>не удалось</strong> пересчитать.</span><br />";	
	}

//Количество сообщений у каждого пользователя
$sql3 = "UPDATE core_members LEFT JOIN (
	SELECT author_id, count(0) AS messages_cnt
	FROM forums_posts WHERE queued=0
	GROUP BY author_id
	) msg_cnt ON author_id = core_members.member_id
	SET member_posts = coalesce(messages_cnt, 0)";
$result3 = mysql_query($sql3) or die(mysql_error());

if ((isset($result3)) AND ($result3 != "")) 
	{
		echo "<span style=\"color: green;\">Количество сообщений у каждого пользователя <strong>успешно</strong> пересчитано.</span><br />";
	}
	else
	{
		echo "<span style=\"color: red;\">Количество сообщений каждого пользователя <strong>не удалось</strong> пересчитать.</span><br />";	
	}

//Общее количество одобренных сообщений на форуме
$sql3 = "SELECT COUNT(*) FROM `forums_posts` WHERE `queued` = '0'";
$request3 = mysql_query($sql3) or die(mysql_error());
$result3 = mysql_fetch_array($request3);
$resultat3 = $result3[0];

if ((isset($result3)) AND ($result3 != "")) 
	{
		echo "<span style=\"color: green;\">Общее количество одобренных сообщений на форуме: <strong>" . $resultat3 . "</strong>.</span><br />";
	}
	else
	{
		echo "<span style=\"color: red;\">общее количество сообщений одобренных на форуме <strong>не удалось</strong> посчитать.</span><br />";	
	}

//Общее количество утвержденных тем на форуме
$sql4 = "SELECT COUNT(*) FROM `forums_topics` WHERE `approved` = '1'";
$request4 = mysql_query($sql4) or die(mysql_error());
$result4 = mysql_fetch_array($request4);
$resultat4 = $result4[0];

if ((isset($result4)) AND ($result4 != "")) 
	{
		echo "<span style=\"color: green;\">Общее количество утвержденных тем на форуме: <strong>" . $resultat4 . "</strong>.</span><br />";
	}
	else
	{
		echo "<span style=\"color: red;\">Количество утвержденных тем на форуме <strong>не удалось</strong> посчитать.</span><br />";	
	}
?>
</body>
</html>

 

Если файл будет полезен, пишите. Возможно в будущем будет обновляться. Всем спасибо за внимание.

Возможно вам также будут интересны другие мои темы:

 

restatic.php

Ссылка на комментарий
Поделиться на другие сайты

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

Не нашел и просто залез в SQL и поправил ручками :)

 

Ссылка на комментарий
Поделиться на другие сайты

rsergio, можно конечно и так, если форум не слишком большой.

Ссылка на комментарий
Поделиться на другие сайты

Не работает - указав параметры подключения к БД

Fatal error: Uncaught Error: Call to undefined function mysql_connec() in /......./......./......../restatic.php:10 Stack trace: #0 {main} thrown in /......./......../........../restatic.php on line 10

 

Ссылка на комментарий
Поделиться на другие сайты

А версия какая?

Попробуй вместо mysql написать mysqli

Ссылка на комментарий
Поделиться на другие сайты

На localhost работает .... но на реалний форум нет ..... Попробул вместо mysql написать mysqli - но ошибка ест

Ссылка на комментарий
Поделиться на другие сайты

И почему mysql_connec() вместо mysql_connect() ?

Ссылка на комментарий
Поделиться на другие сайты

нет .... 

Изменено пользователем Silence
Ссылка на комментарий
Поделиться на другие сайты

Только что, Silence сказал:

ааааааааааа ...... ето вашая ошибка .... 

У меня все нормально. Возможно, когда данные вносил, лишнего стер?

Ссылка на комментарий
Поделиться на другие сайты

Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /---/---/---/restatic.php:10 Stack trace: #0 {main} thrown in /---/---/---/restatic.php on line 10

 

Мой код:

Спойлер

<!DOCTYPE html>
<html>
<head>
  <META content="text/html; charset=utf-8" http-equiv="Content-Type">
  <title>ReStatic v0.1 (17 nov 2016) - [email protected]</title>
</head>
<body>
<?php
//Настройки подключения к вашей БД
mysql_connect("--------", "--------", "-------");	//хост_бд, имя_пользователя_бд, пароль_пользователя_бд
mysql_select_db("------");	//имя_бд
mysql_query  ("set_client='utf8'");
mysql_query  ("set character_set_results='utf8'");
mysql_query  ("set collation_connection='utf8_general_ci'");
mysql_query  ("SET NAMES utf8");

//Количество сообщений в каждой теме
$sql1 = "UPDATE forums_topics LEFT JOIN (
	SELECT topic_id, count(0) AS messages_cnt
	FROM forums_posts WHERE queued=0
	GROUP BY topic_id
	) msg_cnt ON topic_id = forums_topics.tid
	SET posts = coalesce(messages_cnt, 0)";
$result1 = mysql_query($sql1) or die(mysql_error());

if ((isset($result1)) AND ($result1 != "")) 
	{
		echo "<span style=\"color: green;\">Количество сообщений в каждой теме <strong>успешно</strong> пересчитано.</span><br />";
	}
	else
	{
		echo "<span style=\"color: red;\">Количество сообщений в каждой теме <strong>не удалось</strong> пересчитать.</span><br />";	
	}

//Количество тем в каждом разделе
$sql2 = "UPDATE forums_forums LEFT JOIN (
    SELECT forum_id, count(0) AS topics_cnt, sum(posts) AS msg_cnt
    FROM forums_topics WHERE approved=1
    GROUP BY forum_id
	) msg_cnt ON forum_id = forums_forums.id
	SET topics = coalesce(topics_cnt, 0),
    posts = coalesce(msg_cnt, 0)";
$result2 = mysql_query($sql2) or die(mysql_error());

if ((isset($result2)) AND ($result2 != "")) 
	{
		echo "<span style=\"color: green;\">Количество тем в каждом разделе <strong>успешно</strong> пересчитано.</span><br />";
	}
	else
	{
		echo "<span style=\"color: red;\">Количество тем в каждом разделе <strong>не удалось</strong> пересчитать.</span><br />";	
	}

//Количество сообщений у каждого пользователя
$sql3 = "UPDATE core_members LEFT JOIN (
	SELECT author_id, count(0) AS messages_cnt
	FROM forums_posts WHERE queued=0
	GROUP BY author_id
	) msg_cnt ON author_id = core_members.member_id
	SET member_posts = coalesce(messages_cnt, 0)";
$result3 = mysql_query($sql3) or die(mysql_error());

if ((isset($result3)) AND ($result3 != "")) 
	{
		echo "<span style=\"color: green;\">Количество сообщений у каждого пользователя <strong>успешно</strong> пересчитано.</span><br />";
	}
	else
	{
		echo "<span style=\"color: red;\">Количество сообщений каждого пользователя <strong>не удалось</strong> пересчитать.</span><br />";	
	}

//Общее количество одобренных сообщений на форуме
$sql3 = "SELECT COUNT(*) FROM `forums_posts` WHERE `queued` = '0'";
$request3 = mysql_query($sql3) or die(mysql_error());
$result3 = mysql_fetch_array($request3);
$resultat3 = $result3[0];

if ((isset($result3)) AND ($result3 != "")) 
	{
		echo "<span style=\"color: green;\">Общее количество одобренных сообщений на форуме: <strong>" . $resultat3 . "</strong>.</span><br />";
	}
	else
	{
		echo "<span style=\"color: red;\">общее количество сообщений одобренных на форуме <strong>не удалось</strong> посчитать.</span><br />";	
	}

//Общее количество утвержденных тем на форуме
$sql4 = "SELECT COUNT(*) FROM `forums_topics` WHERE `approved` = '1'";
$request4 = mysql_query($sql4) or die(mysql_error());
$result4 = mysql_fetch_array($request4);
$resultat4 = $result4[0];

if ((isset($result4)) AND ($result4 != "")) 
	{
		echo "<span style=\"color: green;\">Общее количество утвержденных тем на форуме: <strong>" . $resultat4 . "</strong>.</span><br />";
	}
	else
	{
		echo "<span style=\"color: red;\">Количество утвержденных тем на форуме <strong>не удалось</strong> посчитать.</span><br />";	
	}
?>
</body>
</html>

 

 

Ссылка на комментарий
Поделиться на другие сайты

Можно опубликовать запросы Mysql с комментариями здесь на форуме, чтобы их можно было выполнить через phpmyadmin. Тогда не нужно будет никакие файлы загружать на сервер.

Ссылка на комментарий
Поделиться на другие сайты

mysql_ * функции были удалены в PHP7 

Ссылка на комментарий
Поделиться на другие сайты

12 часов назад, Heavenanvil сказал:

На данный момент скрипт умеет (v0.1 - 17.11.2016):

  • Пересчитывать количество сообщений в каждой теме;
  • Пересчитывать количество тем в каждом разделе;
  • Пересчитывать количество сообщений у каждого пользователя (то, что можно сделать через админцентр);

Скрипт для phpmyadmin, взятый из приведенного выше php-кода. Делает тоже самое. 

Инструкция: Войдите в phpmyadmin, откройте базу данных форума, во вкладку SQL вставьте приведенный скрипт для обновления статистики форума. Если у вас установлен sql_tbl_prefix, то вам нужно будет добавить его в приведенные запросы. Внимание! Все действия с базой данных необратимы, вы выполняете их на свой страх и риск.

-- Количество сообщений в каждой теме
UPDATE forums_topics LEFT JOIN (
	SELECT topic_id, count(0) AS messages_cnt
	FROM forums_posts WHERE queued=0
	GROUP BY topic_id
	) msg_cnt ON topic_id = forums_topics.tid
	SET posts = coalesce(messages_cnt, 0);

-- Количество тем в каждом разделе
UPDATE forums_forums LEFT JOIN (
    SELECT forum_id, count(0) AS topics_cnt, sum(posts) AS msg_cnt
    FROM forums_topics WHERE approved=1
    GROUP BY forum_id
	) msg_cnt ON forum_id = forums_forums.id
	SET topics = coalesce(topics_cnt, 0),
    posts = coalesce(msg_cnt, 0);

-- Количество сообщений у каждого пользователя
UPDATE core_members LEFT JOIN (
	SELECT author_id, count(0) AS messages_cnt
	FROM forums_posts WHERE queued=0
	GROUP BY author_id
	) msg_cnt ON author_id = core_members.member_id
	SET member_posts = coalesce(messages_cnt, 0);

 

Ссылка на комментарий
Поделиться на другие сайты

50 минут назад, ram108 сказал:

-- Количество сообщений у каждого пользователя

После этого запроса у меня в профайле количество сообщений увеличилось практически в 2 раза! O.o

Скорее всего скрипт не учитывает, что в некоторых разделах может стоять запрет на увеличение счетчика сообщений. У нас на форуме закрытый административный раздел, где общается команда. Сообщения в этом разделе не обновляют счетчик сообщений.

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, ram108 сказал:

Скрипт для phpmyadmin, взятый из приведенного выше php-кода. Делает тоже самое. 

Конечно. Вы просто выполняете его напрямую, без использования php и подключения к бд.

4 часа назад, ram108 сказал:

После этого запроса у меня в профайле количество сообщений увеличилось практически в 2 раза! O.o

Скорее всего скрипт не учитывает, что в некоторых разделах может стоять запрет на увеличение счетчика сообщений. У нас на форуме закрытый административный раздел, где общается команда. Сообщения в этом разделе не обновляют счетчик сообщений.

Да, это верно. Я подозревал, что не учел некоторых показателей при пересчете, например, как я уже говорил, не считает архив.  Возможно доработаю скрипт.
Чтобы вернуть актуальный счетчик сообщений пользователей, пока можете воспользоваться стандартными способами перерасчета.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...