Add-On DB Maintenance: Statistiken und Altlasten bereinigen

Allgemeiner Support zum phpBB 2 Board und phpBB 2 Modifikationen
Forumsregeln
Auch wenn hier der Support für phpBB 2 weiterhin aufrecht erhalten bleibt, weisen wir darauf hin, dass das phpBB 2 nicht mehr offiziell unterstützt und weiterentwickelt wird!
Antworten
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Add-On DB Maintenance: Statistiken und Altlasten bereinigen

Beitrag von oxpus »

Das folgende Add-On fügt dem DB Maintenance Mod zwei neue Funktionen hinzu:

Bereinigung der User, Post- und Topicstatistik (Funktion "statistic_check")
Diese Funktion führt die "echte" Board-Ministatistik für User-, Post und Topicanzahl aus und korrigiert die durch den Categories Hierarchy Mod verwalteten Einträge in der Tabelle phpbb_config.
Diese Funktion und die zugehörigen Spracheinträge dürfen nur installiert werden, wenn auch der Categories Hierarchy Mod ab Version 2.0.4 installiert ist!

Entfernen von Daten gelöschter User (Funktion "deleted_user_check")
Hierbei sind alle Tabellen zu prüfen und die Einträge im nachfolgenden Snippet in diesen angeführten Zeilen anzupassen:

Code: Alles auswählen

				$tables_deleted_userdata = array('admin_nav_module', 'attach_quota', 'banlist', 'bookmarks', 'buddies', 'buddies', 'jr_admin_users', 'meeting_comment', 'meeting_user', 'mod_author', 'mod_requests', 'notes', 'smilies_album_rate', 'topic_view', 'topics_email', 'topics_watch', 'upi2db_read_forum', 'upi2db_read_topics', 'user_board_links', 'user_portal_links', 'verified_user', 'verify_banlist');
				$fields_deleted_userdata = array('user_id', 'user_id', 'ban_userid', 'user_id', 'user_id', 'buddy_id', 'user_id', 'user_id', 'user_id', 'author_user_id', 'user_id', 'poster_id', 'rate_user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'ban_userid');
Die Variable $tables_deleted_userdata beinhaltet alle Tabellennamen (ohne Tabellenprefix!), die zu prüfen sind. Die Variable $fields_deleted_userdata beinhaltet alle Schlüsselfelder in den vorher definierten Tabellen, die die User-IDs der gelöschten User beinhalten.
Die Funktion liest dann zunächst alle existieren User aus und vergleicht die Daten in den Tabellen mit den ermittelten User-IDs. Alle somit nicht verifizierten User-Daten werden gelöscht.

Und hier nun das Snippet selber (Genaue Position in den Sprachdateien beachten!)

Code: Alles auswählen

#
#-----[ OPEN ]-----
#
admin/admin_db_maintanance.php

#
#-----[ FIND ]-----
#
			case 'config': // Configuration
				if( isset($HTTP_POST_VARS['submit']) )

#
#-----[ BEFORE, ADD ]-----
#
			case 'statistic_check':

				echo("<h1>Prüfe Board-Statistik</h1>\n");

				lock_db();

				$sql = "SELECT count(user_id) as total_user FROM " . USERS_TABLE . "
					WHERE user_id <> " . ANONYMOUS;
				if ( !($result = $db->sql_query($sql)) )
				{
					throw_error("Couldn't get statistic data!", __LINE__, __FILE__, $sql);
				}
				while ( $row = $db->sql_fetchrow($result) )
				{
					$total_user = $row['total_user'];
				}

				echo("<p class=\"gen\"><b>Gefundene User:</b> " . $total_user . "</p>\n");

				$sql = "SELECT config_value as board_user FROM " . CONFIG_TABLE . "
					WHERE config_name = 'max_users'";
				if ( !($result = $db->sql_query($sql)) )
				{
					throw_error("Couldn't get statistic data!", __LINE__, __FILE__, $sql);
				}
				while ( $row = $db->sql_fetchrow($result) )
				{
					$board_user = $row['board_user'];
				}

				echo("<p class=\"gen\"><b>Eingetragene Userzahl:</b> " . $board_user . "</p>\n");

				if ( $total_user == $board_user )
				{
					echo($lang['Nothing_to_do']);
				}
				else
				{
					$sql = "UPDATE " . CONFIG_TABLE . "
						SET config_value = $total_user
						WHERE config_name = 'max_users'";
					if ( !($result = $db->sql_query($sql)) )
					{
						throw_error("Couldn't update statistic data!", __LINE__, __FILE__, $sql);
					}
					echo("<p class=\"gen\">Useranzahl korrigiert</p>\n");
				}

				$sql = "SELECT count(topic_id) as total_topics FROM " . TOPICS_TABLE;
				if ( !($result = $db->sql_query($sql)) )
				{
					throw_error("Couldn't get statistic data!", __LINE__, __FILE__, $sql);
				}
				while ( $row = $db->sql_fetchrow($result) )
				{
					$total_topics = $row['total_topics'];
				}

				echo("<p class=\"gen\"><b>Gefundene Topics:</b> " . $total_topics . "</p>\n");

				$sql = "SELECT config_value as board_topics FROM " . CONFIG_TABLE . "
					WHERE config_name = 'max_topics'";
				if ( !($result = $db->sql_query($sql)) )
				{
					throw_error("Couldn't get statistic data!", __LINE__, __FILE__, $sql);
				}
				while ( $row = $db->sql_fetchrow($result) )
				{
					$board_topics = $row['board_topics'];
				}

				echo("<p class=\"gen\"><b>Eingetragene Topicanzahl:</b> " . $board_topics . "</p>\n");

				if ( $total_topics == $board_topics )
				{
					echo($lang['Nothing_to_do']);
				}
				else
				{
					$sql = "UPDATE " . CONFIG_TABLE . "
						SET config_value = $total_topics
						WHERE config_name = 'max_topics'";
					if ( !($result = $db->sql_query($sql)) )
					{
						throw_error("Couldn't update statistic data!", __LINE__, __FILE__, $sql);
					}
					echo("<p class=\"gen\">Topicanzahl korrigiert</p>\n");
				}

				$sql = "SELECT count(post_id) as total_posts FROM " . POSTS_TABLE;
				if ( !($result = $db->sql_query($sql)) )
				{
					throw_error("Couldn't get statistic data!", __LINE__, __FILE__, $sql);
				}
				while ( $row = $db->sql_fetchrow($result) )
				{
					$total_posts = $row['total_posts'];
				}

				echo("<p class=\"gen\"><b>Gefundene Beiträge:</b> " . $total_posts . "</p>\n");

				$sql = "SELECT config_value as board_posts FROM " . CONFIG_TABLE . "
					WHERE config_name = 'max_posts'";
				if ( !($result = $db->sql_query($sql)) )
				{
					throw_error("Couldn't get statistic data!", __LINE__, __FILE__, $sql);
				}
				while ( $row = $db->sql_fetchrow($result) )
				{
					$board_posts = $row['board_posts'];
				}

				echo("<p class=\"gen\"><b>Eingetragene Beitragsanzahl:</b> " . $board_posts . "</p>\n");

				if ( $total_posts == $board_posts )
				{
					echo($lang['Nothing_to_do']);
				}
				else
				{
					$sql = "UPDATE " . CONFIG_TABLE . "
						SET config_value = $total_posts
						WHERE config_name = 'max_posts'";
					if ( !($result = $db->sql_query($sql)) )
					{
						throw_error("Couldn't update statistic data!", __LINE__, __FILE__, $sql);
					}
					echo("<p class=\"gen\">Postanzahl korrigiert</p>\n");
				}

				lock_db(true);

				break;
			case 'deleted_user_check':

				echo("<h1>Prüfe Tabellen auf gelöschte Userdaten</h1>\n");

				lock_db();

				$all_user_ids = array();
				$sql = "SELECT user_id FROM " . USERS_TABLE . "
					WHERE user_id <> " . ANONYMOUS;
				if ( !($result = $db->sql_query($sql)) )
				{
					throw_error("Couldn't get statistic data!", __LINE__, __FILE__, $sql);
				}
				while ( $row = $db->sql_fetchrow($result) )
				{
					$all_user_ids[] = $row['user_id'];
				}

				$sql_user_ids = implode(', ', $all_user_ids);
				$db->sql_freeresult($result);

				echo("<p class=\"gen\"><b>" . sizeof($all_user_ids) . " Gefundene User: </b>\n" . $sql_user_ids . "</p><br />");

				$tables_deleted_userdata = array('admin_nav_module', 'attach_quota', 'banlist', 'bookmarks', 'buddies', 'buddies', 'jr_admin_users', 'meeting_comment', 'meeting_user', 'mod_author', 'mod_requests', 'notes', 'smilies_album_rate', 'topic_view', 'topics_email', 'topics_watch', 'upi2db_read_forum', 'upi2db_read_topics', 'user_board_links', 'user_portal_links', 'verified_user', 'verify_banlist');
				$fields_deleted_userdata = array('user_id', 'user_id', 'ban_userid', 'user_id', 'user_id', 'buddy_id', 'user_id', 'user_id', 'user_id', 'author_user_id', 'user_id', 'poster_id', 'rate_user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'ban_userid');

				$total_deleted_datarows = 0;

				for ($di = 0; $di < sizeof($tables_deleted_userdata); $di++)
				{
					echo("<p class=\"gen\"><b>Prüfe Tabelle: </b>" . $table_prefix. $tables_deleted_userdata[$di] . ":</p>");

					$sql = "SELECT * FROM " . $table_prefix. $tables_deleted_userdata[$di] . "
						WHERE " . $fields_deleted_userdata[$di] . " NOT IN ($sql_user_ids)";
					if ( !($result = $db->sql_query($sql)) )
					{
						throw_error("Couldn't count user data!", __LINE__, __FILE__, $sql);
					}
					$to_delete_datarows = $db->sql_numrows($result);
					$total_deleted_datarows += $to_delete_datarows;
					$db->sql_freeresult($result);

					echo("<p class=\"gen\">Gefundene Datensätze: " . $to_delete_datarows . "&nbsp;&nbsp;&nbsp;");
					
					if ($to_delete_datarows != 0)
					{
						$sql = "DELETE FROM " . $table_prefix. $tables_deleted_userdata[$di] . "
							WHERE " . $fields_deleted_userdata[$di] . " NOT IN ($sql_user_ids)";
						if ( !($result = $db->sql_query($sql)) )
						{
							throw_error("Couldn't delete user data!", __LINE__, __FILE__, $sql);
						}
						echo("<span style=\"color: #FF0000\">Benutzerdaten gelöscht</span></p>\n");
					}
					else
					{
						echo("<span  style=\"color: #009000\">Keine Arbeit nötig ;-)</span></p>\n");
					}
				}

				lock_db(true);

				if ($total_deleted_datarows != 0)
				{
					echo ("<p class=\"gen\"><br /><br />Es wurden <b>" . $total_deleted_datarows . "</b> zurückgebliebene Datensätze gelöscht.<br />Die Tabellen sollten jetzt abschliessend <a href=\"".append_sid("admin_db_maintenance.".$phpEx."?mode=start&function=optimize_db")."\" class=\"nav\">optimiert</a> werden.");
				}

				break;

#
#-----[ OPEN ]-----
#
language/lang_english/lang_dbmtnc.php

#
#-----[ FIND ]-----
#
$mtnc[] = array('statistic',
	'Statistics',
	'Shows information about the board and the database.',
	'',
	0);

#
#-----[ AFTER, ADD ]-----
#
$mtnc[] = array('statistic_check',
	'Fix Statistics',
	'This will check and fix all board statistics for post- and usercounts in the database.',
	'',
	0);
$mtnc[] = array('deleted_user_check',
	'Check deleted user datas',
	'This will check all tables for datas from deleted users and delete found entries.',
	'',
	0);

#
#-----[ OPEN ]-----
#
language/lang_english/lang_dbmtnc.php

#
#-----[ FIND ]-----
#
$mtnc[] = array('statistic',
	'Statistiken',
	'Zeigt statistische Daten über die Datenbank und das Board an.',
	'',
	0);

#
#-----[ AFTER, ADD ]-----
#
$mtnc[] = array('statistic_check',
	'Statistiken korrigieren',
	'Diese Funktion prüft alle Statistiken zu Beitrags- und Benutzerzahlen und korrigiert die Einträge in der Datenbank.',
	'',
	0);
$mtnc[] = array('deleted_user_check',
	'Prüfe Daten gelöschter User',
	'Diese Funktion prüft als Tabellen auf Daten gelöschter User und entfernt die gefundenen Einträge.',
	'',
	0);


#
#-----[ SAVE/CLOSE ALL FILES ]-----
#
# EoM
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Ooooh prima prima prima. :hurra:

THX
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Stoebi
Beiträge: 447
Registriert: Do 24.Feb, 2005 16:35
Wohnort: Berlin
Kontaktdaten:

Beitrag von Stoebi »

Guten Morgen,

super, gefällt mir. Herzlichen Dank.

Aber ich hab hier bei meinem 1.52 Plus Board (2.0.15) folgende Fehlermeldung nach der
Ausführung von 'Prüfe Tabellen auf gelöschte Userdaten'
Sperre das Board

Warte drei Sekunden, damit Datenbanktransaktionen beendet werden können...

15 Gefundene User: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16



Prüfe Tabelle: phpbb2_admin_nav_module:

Fehler: Couldn't count user data!

SQL Error : 1146 Table 'test.phpbb2_admin_nav_module' doesn't exist

SELECT * FROM phpbb2_admin_nav_module WHERE user_id NOT IN (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)

Line : 492
File : D:\apachefriends\xampp\htdocs\board\admin\admin_db_maintenance.php
Welcher MOD braucht denn <phpbb2>_admin_nav_module, bzw. welches Skript benötigt dieses <phpbb2>_admin_nav_module ausser admin_db_maintenance.php?


Oxpus schrieb:
Entfernen von Daten gelöschter User (Funktion "deleted_user_check")
Hierbei sind alle Tabellen zu prüfen und die Einträge im nachfolgenden Snippet in diesen angeführten Zeilen anzupassen:
Wie das in meinem Fall, ohne was falsch zu machen?



Gruß Stöbi


EDIT:
Verstehe langsam. Doch einiges anzupassen.

EDIT2:
Geschafft, super Sache. Und wieder einiges an Platz geschaffen. :)
Zuletzt geändert von Stoebi am So 05.Jun, 2005 16:30, insgesamt 4-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Keine Ursache.
Ich fand die Lösung eben am Besten, ohne wirklich jeden einzelnen Mod, der User löschen kann, anzupassen.
Wird ab einer gewissen Anzahl Tabellen schnell zu einer Lebensaufgabe.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
blondi
Beiträge: 1091
Registriert: Do 30.Sep, 2004 14:36

Beitrag von blondi »

kann ich das bei mir auch verbauen oxpus...weil ich habe noch die erste version der category hyrachie drinnen...
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Schau nach, ob Du Felder wie "max_posts" oder "newest_user_id" in der Tabelle phpbb_config hast. Dann auf jeden Fall.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
volker58
Beiträge: 724
Registriert: Mo 27.Dez, 2004 19:22
Wohnort: Annaberg-Buchholz
Kontaktdaten:

Beitrag von volker58 »

ist es viel arbeit, oder besser gefragt macht es sinn den mod zu erweitern für die dimension mit 104 tabellen?
Gruss Volker

http://www.fuchsienfreunde.de
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Für mich ja, da ich das Dimension nicht kenne.
Du musst nur schauen, wo User-Datei enthalten sind und diese Tabellennamen sowie die User-ID-Schlüsselfelder in mein Add-On eintragen. Fertig.
Dabei sollten aber alle Tabellen ausgespart werden, die eh in der admin_users.php berücksichtigt werden. Also dort schauen, aus welchen Tabellen mit DELETE alles gelöscht wird.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Snoopy
Beiträge: 1080
Registriert: So 26.Sep, 2004 20:23
Wohnort: Hannover
Kontaktdaten:

Beitrag von Snoopy »

# $tables_deleted_userdata = array('admin_nav_module', 'attach_quota', 'banlist', 'bookmarks', 'buddies', 'buddies', 'jr_admin_users', 'meeting_comment', 'meeting_user', 'mod_author', 'mod_requests', 'notes', 'smilies_album_rate', 'topic_view', 'topics_email', 'topics_watch', 'upi2db_read_forum', 'upi2db_read_topics', 'user_board_links', 'user_portal_links', 'verified_user', 'verify_banlist');
# $fields_deleted_userdata = array('user_id', 'user_id', 'ban_userid', 'user_id', 'user_id', 'buddy_id', 'user_id', 'user_id', 'user_id', 'author_user_id', 'user_id', 'poster_id', 'rate_user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'user_id', 'ban_userid');

Im ersten bekomme ich es ja noch hin, das rauszulöschen was ich nicht hab! Aber mit dem 2. hab ich so meine Problem, wegen den vielen user_id oder müssen die bleiben!


Was sollte man denn da alles dann noch so reinmachen?
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Das erste Array sind, wie erkannt, die Tabellennamen, das zweite Array beinhaltet die Bezeichnung des jeweiligen User-ID-Feldes, daß auf den gelöschten User hindeutet.
In der Regel ist das dann auch "user_id", bei manchen Tabellen aber ein anderes Feld.

Man muss das auch so verstehen:
Finde in Tabelle X alle Datensätze, die der nicht mehr vorhandenen User-ID Y zugeordnet sind und lösche diese.
Daher brauche ich je Tabelle dessen Namen und das Referenzfeld für die User-ID...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Snoopy
Beiträge: 1080
Registriert: So 26.Sep, 2004 20:23
Wohnort: Hannover
Kontaktdaten:

Beitrag von Snoopy »

Versteh ich das richtig, das ich die ganzen user_id stehen lassen kann?


Am besten ist doch, wenn ich in der Tabelle für die Userdaten nachschaue und dann in dem 2 array eintrag, oder? Was ich da dann eingetragen habe, muss ich logischerwiße ja im 1 array eintragen. Richtig???
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Öh, scheinbar hast Du es noch nicht so richtig verstanden.
Das 1. Array beinhaltet die Tabellennamen, in denen die zu löschenden Daten gesucht werden sollen.
Passend dazu werden im 2. Array die Feldnamen angegeben, in denen die betreffende User-ID der gelöschten User zu finden ist.
Somit muss zu jedem Tabellennamen im 1. Array ein Feldname im 2. Array stehen.
Und da das in den meisten Fällen das Feld user_id ist, kommt es auch so oft vor.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Snoopy
Beiträge: 1080
Registriert: So 26.Sep, 2004 20:23
Wohnort: Hannover
Kontaktdaten:

Beitrag von Snoopy »

Ok, soweit alles klar!


Leider weiß ich nicht welche Tabellen noch zugefügt werden sollten, demnach werd ich es wohl lassen!
Antworten