Seite 1 von 1
Bestimmter SQL-Befehl für phpbb_users gesucht
Verfasst: 09.09.2006 18:16
von IPB_Flüchtling
Ahoi,
ich habe in der Tabelle phpbb_users ein neues Feld angelegt, in das ich nun für jeden User das Datum seines letzten Beitrags eintragen möchte. Gibt es dafür eine SQL-Anweisung, die das Gewünschte für jeden User automatisch durchführt?
Sinn der Sache ist leicht erklärt: Man könnte z.B. den Last Visit Hack so erweitern, dass die Mitgliederliste auch nach dem Datum des letzten Beitrags sortiert werden kann. Und den folgenden Mod könnte man so umschreiben, dass nicht pro Mitglied, das in der Mitgliederliste angezeigt wird, ein zusätzliches Query benötigt wird...
## Hack Title: Add Last User Post Date to Members List
## (A phpBB2 Quickie)
## Author: Nivisec (
support@nivisec.com)
##
http://www.nivisec.com
## Description: Adds a new field in the members list that displays the date
## that the user last posted on. "None" will be displayed if
## the user has never posted.
Oder geht das von mir Gewünschte gar nicht?
Schönes Wochenende!
IPB_Flüchtling
Verfasst: 09.09.2006 18:35
von S2B
Du musst halt folgendes Query ausführen, wenn der Benutzer einen Beitrag absendet:
Code: Alles auswählen
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_last_post = ' . time() . '
WHERE user_id = ' . $userdata['user_id'];
Noch besser ist es natürlich, wenn du das Query gleich noch mit dem anderen Query (das die Anzahl der Posts aktualisiert) verbindest.

Verfasst: 09.09.2006 18:54
von IPB_Flüchtling
Ahoi S2B,
vielen Dank für die Antwort! Also bei neuen Postings ist das kein Problem: Da wird das Datum des letzten Beitrags ohnehin korrekt in das neue Feld ct_last_post der Tabelle phpbb_users eingetragen. Das erledigt die neue CrackerTracker-Generation.
Nur bei den Usern, die seit der Installation des CT noch nichts gepostet haben, steht im Feld ct_last_post halt nur eine 1.
Jetzt wäre es wünschenswert, wenn ich das Feld ct_last_post für alle User nachträglich und einmalig mit den korrekten Werten auffüllen könnte. Dazu müsste für jeden User das Datum des letzten Beitrags halt irgendwo in der Datenbank gespeichert sein. (Weiß nicht genau, ob das überhaupt der Fall ist.)
Ich hätte diesen Wert aus Performancegründen halt gern im Feld ct_last_post gehabt. (Und weil das für mich die einzige Chance ist, die beiden oben genannten Mods nach meinen Vorstellungen anzupassen.

)
Wenn Dir (oder jemand anderem) etwas dazu einfällt, bitte melden!
LG, IPB_Flüchtling
EDIT:
Habe in einem der beiden oben genannten Mods das hier gefunden:
Code: Alles auswählen
$post_time_sql = "SELECT post_time
FROM " . POSTS_TABLE . "
WHERE poster_id = " . $user_id . "
ORDER BY post_time DESC
LIMIT 1";
Kann man das also so übertragen, dass der Wert für den letzten Beitrag eines jeden Users im Feld (phpbb_users)ct_last_post landet?
Verfasst: 10.09.2006 19:29
von Miriam
Nicht ganz. Denn das liest nur die Zeit des letzten Postings des angemeldeten Users aus..... Also desjenigen, der den Code durch ein PHP Datei beim Surfen durchs Forum ausführt.
Mein Vorschlag lautet daher:
1. Alle User_ids auslesen und in einem Array speichern
2. die maximalen Postzeiten der jeweiligen user_ids auslesen und mit in dieses Array schreiben. Und zwar so, dass die User_id und die Postzeit zusammengehörig gespeichert werden.
3. Die paarweisen IDs/Zeiten aus dem Array auslesen und in die Spalte ct_last_post eintragen.
Ein findiger DB Progger macht das sicherlich in einem Rutsch... Aber so geht's auch.
Verfasst: 10.09.2006 20:07
von IPB_Flüchtling
Hallo Miriam,
danke für Deine Antwort!
Leider übersteigt das derzeit noch meine Fähigkeiten.

Aber vielleicht probiere ich es einfach so, die Mods (v.a. den Last Visit Hack) anzupassen. Mehr als falsche Angaben in der Spalte "Letzter Beitrag" bei manchen Usern kann ja ohnehin nicht passieren.
Schönen Abend noch!
IPB_Flüchtling
Verfasst: 11.09.2006 01:28
von S2B
Teste mal sowas:
Code: Alles auswählen
$sql = 'SELECT u.user_id, MAX(p.post_time) AS post_time
FROM ' . USERS_TABLE . ' u
INNER JOIN ' . POSTS_TABLE . ' p
ON p.poster_id = u.user_id
WHERE u.user_id <> ' . ANONYMOUS;
if (!$result = $db->sql_query($sql))
{
message_die(GENERAL_ERROR, 'Could not get last post time', '', __LINE__, __FILE__, $sql);
}
while ($row = $db->sql_fetchrow($result))
{
$sql = 'UPDATE ' . USERS_TABLE . '
SET ct_last_post = ' . $row['post_time'] . '
WHERE user_id = ' . $row['user_id'];
if (!$db->sql_query($sql))
{
message_die(GENERAL_ERROR, 'Could not update last post time', '', __LINE__, __FILE__, $sql);
}
}
$db->sql_freeresult($result);
Keine Garantie auf Richtigkeit.

Verfasst: 11.09.2006 11:08
von IPB_Flüchtling
Ahoi,
vielen Dank für Deine Mühe! Leider hat es nicht funktioniert:
Could not get last post time
DEBUG MODE
SQL Error : 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
SELECT u.user_id, MAX(p.post_time) AS post_time FROM phpbb_users u INNER JOIN phpbb_posts p ON p.poster_id = u.user_id WHERE u.user_id <> -1
(Ich habe Deinen Code übrigens einfach in den Inhaltsbereich der Vorlage für in phpBB eingebundene Seiten eingefügt:
http://www.phpbb.de/doku/kb/artikel.php?artikel=72 )
Jetzt ist guter Rat teuer.
LG, IPB_Flüchtling
Verfasst: 11.09.2006 13:11
von S2B
Verdammt.

Immer bei ungetestetem Code...
Code: Alles auswählen
$sql = 'SELECT u.user_id, MAX(p.post_time) AS post_time
FROM ' . USERS_TABLE . ' u
INNER JOIN ' . POSTS_TABLE . ' p
ON p.poster_id = u.user_id
WHERE u.user_id <> ' . ANONYMOUS . '
GROUP BY u.user_id';
[...]
Das Einfügen in die Vorlage ist korrekt.

Verfasst: 11.09.2006 17:06
von IPB_Flüchtling
Herzlichen Dank, S2B!
Ich habe das Script ausgeführt und einen 1. Blick in die Datenbank geworfen. Bei einem User, der 2004 zum letzten Mal etwas gepostet hat, ist dieser Wert korrekt ins Feld ct_last_post eingetragen worden. (Nachgeprüft mit
www.unixtime.de )
Da ich mir den CrackerTracker installiert habe und nun in der USER-Tabelle sowieso ein Feld für den letzten Beitrag vorhanden ist, kann man sich das ja auch zunutze machen.
Die Anpassung des Last Visit Hack schaffe ich (glaube ich) alleine. Und den Mod "Add Last User Post Date to Members List" baue ich mir wieder aus - wenn die Abfrage des letzten Beitrags in ein schon vorhandenes Query eingebaut werden kann, ist das natürlich viel besser als wenn für jeden Benutzer in der Mitgliederliste ein zusätzliches Query benötigt wird.
Vielen Dank noch einmal!
LG, IPB_Flüchtling
Verfasst: 11.09.2006 18:40
von Miriam
S2B hat geschrieben:Verdammt.

Immer bei ungetestetem Code...
Und vor allem bei diesen belämmerten Aggregatfunktionen.

*gell*