Bestimmter SQL-Befehl für phpbb_users gesucht

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
IPB_Flüchtling
Mitglied
Beiträge: 1862
Registriert: 23.12.2004 22:46

Bestimmter SQL-Befehl für phpbb_users gesucht

Beitrag 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... :roll:
## 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
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag 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. :wink:
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
IPB_Flüchtling
Mitglied
Beiträge: 1862
Registriert: 23.12.2004 22:46

Beitrag 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! :P

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?
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag 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.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
IPB_Flüchtling
Mitglied
Beiträge: 1862
Registriert: 23.12.2004 22:46

Beitrag 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
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag 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. :wink:
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
IPB_Flüchtling
Mitglied
Beiträge: 1862
Registriert: 23.12.2004 22:46

Beitrag 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
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

Verdammt. :D Immer bei ungetestetem Code... :wink:

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. :wink:
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
IPB_Flüchtling
Mitglied
Beiträge: 1862
Registriert: 23.12.2004 22:46

Beitrag von IPB_Flüchtling »

Herzlichen Dank, S2B! :P

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
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

S2B hat geschrieben:Verdammt. :D Immer bei ungetestetem Code... :wink:
Und vor allem bei diesen belämmerten Aggregatfunktionen. :) *gell*
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Antworten

Zurück zu „Coding & Technik“