Jump to content

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

Featured Replies

Всем привет. 

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

Пошарив немного по интернету, я решил написать свой собственный 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

Link to comment
https://ipbmafia.ru/topic/15808-pereschityvaem-vsyu-statistiku-foruma-restaticphp/
Share on other sites

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

Не нашел и просто залез в 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() ?

нет .... 

Edited by 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

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.


Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.