Seite 1 von 1
User Online (Gäste werden nicht mehr gezählt)
Verfasst: 26.09.2004 15:59
von hemfrie
Hi zusammen,
ich habe für mein Forum ein Cronjob angelegt, mit dem ich stündlich alle User lösche, die sich innerhalb einer Stunde nicht freigeschaltet haben.
Die Mysql Query sieht wie folgt aus:
Code: Alles auswählen
$sql="DELETE FROM phpbb_users WHERE user_active='0' AND (UNIX_TIMESTAMP() - user_regdate)/3600 >1";
Durch das Löschen dieser User sind aber leider Inkonsistenzen in der Datenbank aufgetreten. Folge ist, dass auf der Forenstartseite die Anzeige der "User Online" nicht mehr funktioniert.
Insgesamt sind 2 Benutzer online: Ein registrierter, ein versteckter und kein Gast.
Es werden zwar noch alle registrierten und versteckten Benutzer gezählt, aber bei den Gästen wird immer 0 angezeigt, obwohl ich im Adminbereich sehen kann, dass dem nicht so ist.
Hat jemand eine Ahnung warum die Zählfunktion der Gäste durch meine Löschaktion beschädigt wurde?

hemfrie
Verfasst: 26.09.2004 17:18
von hemfrie
Ich hab den Fehler gefunden.
In der Tabelle phpbb_users gibt es einen Usereintrag, der für alle Anonymen User (also Gäste) steht.
Genau dieser Usereintrag mit der user_id "-1" wurde natürlich auch von meinem Aufräumskript gelöscht. Damit vielen jetzt alle Gäste beim joinen der Tabellen "phpbb_users" und "phpbb_sessions" raus.

hemfrie
Verfasst: 26.09.2004 17:36
von Dennis63
Bedenke auch, daß für die User je eine Gruppe angelegt wird, die auch gelöscht werden muss..
Grüße
Dennis
Verfasst: 26.09.2004 20:27
von hemfrie
Danke Dennis, das hätte ich sonst glatt vergessen.
Hier mal mein Script, falls jemand mal etwas ähnliches vor hat. Vielleicht sieht ja auch jemand noch einen Fehler
Code: Alles auswählen
include('connection.php');
// Es werden alle inaktiven User gelöscht, die sich nicht innerhalb einer Stunde freigeschaltet haben.
$sql="DELETE FROM phpbb_users WHERE user_active='0' AND user_id!='-1' AND (UNIX_TIMESTAMP() - user_regdate)/3600 >1";
mysql_query($sql);
//---------------------------------- löschen aller inaktiven User Gruppen ----------------------------//
$sql="SELECT phpbb_user_group.user_id AS id
FROM phpbb_user_group LEFT JOIN phpbb_users ON phpbb_user_group.user_id = phpbb_users.user_id
WHERE (((phpbb_users.user_id) Is Null));";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result))
{
$id.="'{$row['id']}'".',';
}
$all_id = preg_replace('/([^)]*),$/', '\\1', $id);
$sql="DELETE FROM phpbb_user_group WHERE user_id IN ($all_id)" or mysql_error();
mysql_query($sql);
//----------------------------------------------------------------------------------------------------//

hemfrie
Verfasst: 26.09.2004 21:04
von Acid
Für registrierte User gibt´s 3 Einträge beim phpBB.. in den Tabellen "users", "user_group" sowie in der Tabelle "groups".
Da du jetzt sicherlich einige Fehler in diesen Bereichen hast, solltest du die Usereinträge mit dem
DB MOD überprüfen.
Verfasst: 26.09.2004 21:30
von hemfrie
Danke für den Hinweis. Das werden ja immer mehr Tabellen
Ich habe ich jetzt das Skript noch etwas erweitert um die verwaisten Einträge in phpbb_groups zu löschen.
Code: Alles auswählen
include('connection.php');
// Es werden alle inaktiven User gelöscht, die sich nicht innerhalb einer Stunde freigeschaltet haben.
$sql="DELETE FROM phpbb_users WHERE user_active='0' AND user_id!='-1' AND (UNIX_TIMESTAMP() - user_regdate)/3600 >1";
mysql_query($sql);
//---------------------------------- löschen aller inaktiven User Gruppen ----------------------------//
$sql="SELECT phpbb_user_group.user_id AS id
FROM phpbb_user_group LEFT JOIN phpbb_users ON phpbb_user_group.user_id = phpbb_users.user_id
WHERE (((phpbb_users.user_id) Is Null));";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result))
{
$id.="'{$row['id']}'".',';
}
$all_id = preg_replace('/([^)]*),$/', '\\1', $id);
$sql="DELETE FROM phpbb_user_group WHERE user_id IN ($all_id)" or mysql_error();
mysql_query($sql);
//----------------------------------------------------------------------------------------------------//
$sql="SELECT phpbb_groups.group_id AS id
FROM phpbb_groups LEFT JOIN phpbb_user_group ON phpbb_groups.group_id = phpbb_user_group.group_id
WHERE (((phpbb_user_group.group_id) Is Null));";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result))
{
$id.="'{$row['id']}'".',';
}
$all_id = preg_replace('/([^)]*),$/', '\\1', $id);
$sql="DELETE FROM phpbb_groups WHERE group_id IN ($all_id)" or mysql_error();
mysql_query($sql);
jetzt müsste eigentlich alles sauber sein.

hemfrie