User in der Schnellantwort auflisten

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.
Benutzeravatar
Allcrime
Mitglied
Beiträge: 47
Registriert: 16.06.2014 18:53
Wohnort: Mittelfranken
Kontaktdaten:

User in der Schnellantwort auflisten

Beitrag von Allcrime »

Hallo phpBB- Spezialisten!

Habe meine Schnellantwort erweitert und würde mir jetzt gerne noch die User auflisten lassen, die zum jeweiligen Thema Beiträge verfasst haben.

Kann mir bitte jemand dabei unter die Arme greifen?

Herzlichen Dank im Vorraus und viele Grüße!


PS: phpBB 3.1.3, eigenes Theme auf Basis vom prosilver
Der Mensch ist binär: 0 oder 1, tot oder lebendig.
Allcrime. Die Kriminalplattform.
Benutzeravatar
Allcrime
Mitglied
Beiträge: 47
Registriert: 16.06.2014 18:53
Wohnort: Mittelfranken
Kontaktdaten:

Re: User in der Schnellantwort auflisten

Beitrag von Allcrime »

Ich habe mir jetzt mal eine Roh- Abfrage zusammengestellt:

Code: Alles auswählen

$abfrage = mysql_query($db, "SELECT * FROM post_username WHERE topic_id = $topic_id ORDER BY post_username ASC");
while($row = mysql_fetch_object($abfrage))
{
  echo $row->post_username;
  echo "<br />";
}
Nicht lachen, aller Anfang ist schwer :)

Mir ist klar, dass noch einiges fehlt... aber geht das in die richtige Richtung?

Danke, falls das mal jemand liest und sich meiner erbarmt ;)

Viele Grüße!
Der Mensch ist binär: 0 oder 1, tot oder lebendig.
Allcrime. Die Kriminalplattform.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: User in der Schnellantwort auflisten

Beitrag von gn#36 »

So kämpfst du mit vielen Dingen auf einmal: korrekte PHP Syntax und Befehle, korrekte SQL Syntax und inhaltlich richtige Abfragen. Das würde ich erst mal für den Anfang reduzieren und so weit es geht aufsplitten. Sofern du das nicht schon nutzt würde ich mir einen der vielen Syntax Highlighter herunterladen, der PHP Funktionen vorschlagen kann, z.B. Eclipse PDT oder Aptana oder was ähnliches. Dann würde ich erst mal schauen, dass die SQL Abfrage inhaltlich und vom Aufbau her korrekt ist, so dass du dich anschließend mit dem PHP Teil beschäftigen kannst und den im Wissen, dass die SQL Abfrage die richtigen Daten liefert separat bearbeiten kannst.

Das einfachste um eine SQL Abfrage zu testen ist, selbige erst mal in phpmyadmin oder was ähnlichem auszuführen um zu schauen ob die richtigen Daten rauskommen. Erst mal völlig vereinfacht für ein spezielles Beispiel, also such dir eine topic ID und führe die Abfrage für die ID durch.

Dabei wirst du bei deiner Abfrage dann vermutlich einen Fehler wie "Unknown Table post_username" oder sowas ähnliches kriegen. Die Standard SQL Syntax lautet nämlich:

Code: Alles auswählen

SELECT feldliste, mit, kommas, getrennt FROM tabelle WHERE bedingung ORDER BY feld ASC
Richtig komplizierte SQL Abfragen baue ich mir zum Teil ebenfalls erst mit phpMyAdmin zusammen um zu sehen ob das richtige rauskommt bevor ich das in ein Skript einbaue. Alternativ baut man die Abfrage zusammen und gibt sie sich dann per "echo" aus um zu schauen was schief geht, indem man das ergebnis dann in phpMyAdmin füttert und dort weiter bearbeitet bis die Fehler behoben sind. Was "richtig kompliziert" ist, hängt aber denke ich vom Kenntnisstand ab und es spricht nichts dagegen, das auch mit einfacheren Abfragen zu tun. Solange du nur mit SELECT Befehlen arbeitest kann auch nichts passieren, das die Datenbank irgendwie kaputt macht. Du kannst höchstens mal eine sehr aufwändige Abfrage bauen, die dir eine ziemliche Auslastung beschert. Aber normalerweise ist PHP in der Ausführungszeit begrenzt, so dass auch da nicht viel passieren kann.

Innerhalb von phpBB würde ich an deiner Stelle auch mit dem DB Objekt arbeiten anstatt mysql Funktionen direkt zu benutzen. Das DB Objekt hilft dir auch beim Zusammenbau von Abfragen, indem es z.B. Arrays automatisch in korrekte SQL Abfragen konvertiert etc.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
Allcrime
Mitglied
Beiträge: 47
Registriert: 16.06.2014 18:53
Wohnort: Mittelfranken
Kontaktdaten:

Re: User in der Schnellantwort auflisten

Beitrag von Allcrime »

Hallo gn#36, wie geht's?

Hast mir schon das eine oder mal geholfen und deswegen DANKE für deine hilfreichen Tipps!

Software habe ich und mit SQL habe ich schon einge Erfahrungen bei MS Access gesammelt. Muss erst mal meine Scheu ablegen, denn Access ist um einiges einfacher, was Abfragen und vor allem die Datenein-/ausgabe betrifft.
Es gibt also viel zu tun... ich packe es an! :)

Dann DANKE nochmal gn#36, bis bald mal wieder ;)

Viele Grüße aus Krefeld!
Der Mensch ist binär: 0 oder 1, tot oder lebendig.
Allcrime. Die Kriminalplattform.
Benutzeravatar
Allcrime
Mitglied
Beiträge: 47
Registriert: 16.06.2014 18:53
Wohnort: Mittelfranken
Kontaktdaten:

Re: User in der Schnellantwort auflisten

Beitrag von Allcrime »

@gn#36,

habe mit dieser Abfrage

Code: Alles auswählen

SELECT `post_username` FROM `phpbb_posts` WHERE `post_username` = `post_username` ORDER BY `phpbb_posts`.`post_username` ASC
ein Ergebnis bzw. Namen bekommen. Allerdings benötige ich einen Filter, der mir die Namen der User ausgibt, die tatsächlich im aktuellen Topic Beiträge geschrieben haben. Ich kenne das mit "ac", aber das geht hier nicht.
Außerdem fehlt mir noch die topic_id, die vom Gefühl her dabei sein müsste.
Der Mensch ist binär: 0 oder 1, tot oder lebendig.
Allcrime. Die Kriminalplattform.
Benutzeravatar
Allcrime
Mitglied
Beiträge: 47
Registriert: 16.06.2014 18:53
Wohnort: Mittelfranken
Kontaktdaten:

Re: User in der Schnellantwort auflisten

Beitrag von Allcrime »

Hallo @gn#36,

Konnte noch ein wenig basteln und bin im Moment auf diesen Stand:

phpbb_topics, Threadersteller des Topic ID 17:

Code: Alles auswählen

SELECT `topic_id`,`topic_poster` FROM `phpbb_topics` WHERE `topic_id` = '17' 
phpbb_topics_posted, Diskussionsteilnehmer des Topic ID 17:

Code: Alles auswählen

SELECT `topic_id`,`user_id` FROM `phpbb_topics_posted` WHERE `topic_id` = 17 ORDER BY `user_id` ASC
Wenn ich jetzt in den beiden Abfragen noch die Usernamen anzeigen lassen könnte, wäre ich schon ein Stückchen weiter.
Und die statische ID 17 muss natürlich wegfallen, benötige ja die Useramen im jeweiligen Topic.

Was sagst du... ist diese Richtung besser?
Der Mensch ist binär: 0 oder 1, tot oder lebendig.
Allcrime. Die Kriminalplattform.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: User in der Schnellantwort auflisten

Beitrag von gn#36 »

Die Frage die du dir stellen solltest ist: Was kommt raus und was sollte rauskommen?

Den zweiten Teil davon solltest du eigentlich ziemlich genau kennen: Du willst eine Liste der Usernamen, die schon in dem Thema gepostet haben. Da du Zugriff auf das Thema mit der ID 17 hast dürftest du dein Ergebnis kontrollieren können und feststellen, dass das so nicht zusammenpasst. Bei deiner ersten Abfrage bekommst du nur genau einen Benutzernamen, bei deiner zweiten bekommst du nur IDs, die du noch mit einem Benutzernamen verknüpfen musst.

Der zweite deiner beiden Wege ist aber der bessere, wobei ich bisher die Tabelle phpbb_topics_posted noch nie verwendet habe. Die Informationen sind im Prinzip auch redundant, weil sie in der Tabelle phpbb_posts auch drin sind. Möglicherweise hat die Speicherung auf die Weise aber bei großen Foren Vorteile, weil ja ein User in einem Thema auch mehrfach schreiben kann. Wenn sie das enthält was ich vermute, dann brauchst du neben dieser Tabelle noch eine weitere Tabelle um an deine Infos zu gelangen: Die Tabelle phpbb_users enthält den Usernamen. Apropos redundante Infos: Die topic_id brauchst du sicher nicht noch mal abfragen, die ist bei allen Ergebnissen gleich, wenn du sie in der WHERE Bedingung auf 17 festnagelst.

Mehrere Tabellen kann man auch in einer Abfrage abfragen. Am besten machst du das mit einem LEFT JOIN. Es gibt eine ganze Reihe anderer joins, aber in meinen Augen ist LEFT JOIN der wichtigste davon den man am häufigsten braucht. Ein LEFT JOIN stellt alle Datensätze der Haupttabelle da und sucht einen passenden Datensatz in der zusätzlichen Tabelle. Welchen, kannst du mit der ON Bedingung angeben. Wird keiner gefunden, sind die zusätzlich abgefragten Felder NULL. In vielen Fällen hat man eine 1:1 Beziehung oder eine N:1 Beziehung und kann z.B. auf diese Weise den Thementitel gemeinsam mit den Beiträgen, den Autorennamen gemeinsam mit den Beiträgen oder ähnliche Dinge abfragen. Die Hauptabfrage sind in beiden Fällen die Beiträge, aber zu jedem Beitrag gehört genau ein Thementitel bzw. ein Autor als "Nebeninformation".

Code: Alles auswählen

SELECT t.felder, j.felder 
FROM tabelle t 
LEFT JOIN tabelle2 j ON t.id = j.id
WHERE bedingung
ORDER BY sortierung ASC
Die Bezeichnungen t und j sind jeweils ein Alias für die beiden Tabellen um nicht so viel schreiben zu müssen. Bei den Feldern im SELECT Teil müssen sie angegeben werden, wenn nicht eindeutig klar ist, aus welcher der beiden Tabellen die Info stammen soll (die user_id oder topic_id gibt es z.B. in mehreren Tabellen).
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
Allcrime
Mitglied
Beiträge: 47
Registriert: 16.06.2014 18:53
Wohnort: Mittelfranken
Kontaktdaten:

Re: User in der Schnellantwort auflisten

Beitrag von Allcrime »

Hallo gn#36!

Habe letzten Abend/ Nacht damit begonnen, mich in die Tabellenstruktur von phpbb einzuarbeiten. Es ist sehr unbefriedigend für mich wenn ich nicht weiß, welche Tabellen mit welchen Primärschlüsseln mit welcher Tabelle/n verknüpft sind. Und deren Inhalte im groben nicht kenne. Das ist "Grundlagenforschung" ohne die es keinen Sinn macht, sich gleich mit Abfragen zu beschäftigen. Wenn ich in Access Datenbanken mache, kenne ich die Struktur ja auch. Aber da ist es einfacher, weil ich die Tabellen selbst anlege und demnach die Inhalte kenne ;) Dazu erstelle ich mir gerade über Screenshots der Tabellen mit je einem Datensatz eine Art Organigramm über phpbb, die ich dann im Zeichenprogramm miteinander verbinden kann. Dann weiß ich direkt, wo ich welche Informationen über meine beabsichtigten Abfragen erhalte und muss in Zukunft nicht mehr lange suchen ;)

Was die Userliste in der Schnellantwort betrifft:

Für mich ist die Tabelle phpbb_topics_posted die Schlüsseltabelle, weil sie zum einen die topic_id beihaltet, mit der ich auf die Informationen der phpbb_topics zugreifen kann und zum anderen die user_id, mit der ich an die Daten der phpbb_users komme. Und ich kann über die phpbb_topics_posted die Datensätze filtern, in meinem Fall eben die User, die in einem Thema Beiträge geschrieben haben.

Nach deiner Vorlage habe ich die Abfrage mal so geschrieben:

Code: Alles auswählen

SELECT
t.topic_id, j.user_id
FROM phpbb_topics_posted t
LEFT JOIN phpbb_users j ON t.topic_id = j.user_id
WHERE topic_id = 17
ORDER BY user_id ASC
Damit wird allerdings nur der Autor mit der ID 17 gefiltert, der im Thema ID 17 Beiträge geschrieben hat. In diesem Fall 7 Beiträge.
Also entweder passt meine Abfrage nicht oder ich frage doch in der falschen Tabelle ab. Und ich habe dabei das Gefühl, Äpfel mit Birnen zu vergleichen :)

Viele Grüße!

PS: der Tipp mit der phpmyadmin war super! Ist einfach in der Handhabung, gibt schon einiges vor und macht noch Spaß beim Direkt- Testen ;)
Der Mensch ist binär: 0 oder 1, tot oder lebendig.
Allcrime. Die Kriminalplattform.
Benutzeravatar
Allcrime
Mitglied
Beiträge: 47
Registriert: 16.06.2014 18:53
Wohnort: Mittelfranken
Kontaktdaten:

Re: User in der Schnellantwort auflisten

Beitrag von Allcrime »

Hallo...

mit dieser Abfrage hatte ich insofern Erfolg, dass ich alle Daten geliefert bekomme:

Code: Alles auswählen

SELECT
t.topic_id, t.topic_title, j.user_id, j.username
FROM phpbb_topics t
LEFT JOIN phpbb_users j ON t.topic_id = j.user_id
ORDER BY username
ASC
Eingegeben habe ich die Abfrage mal in der Tabelle phpbb_topics, die WHERE topic_id = 17 habe ich weggelassen, weil ich mich bei der Userauflistung ja nicht auf dieses Thema festlegen darf.
Der Mensch ist binär: 0 oder 1, tot oder lebendig.
Allcrime. Die Kriminalplattform.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: User in der Schnellantwort auflisten

Beitrag von gn#36 »

Hi Allcrime,

hiermit
Allcrime hat geschrieben:ON t.topic_id = j.user_id
Vergleichst du Äpfel mit Birnen ;) Das ON Statement verknüpft zwei oder mehr Felder in den beiden Tabellen miteinander. Du suchst hier in der User Tabelle nach Einträgen die die gleiche User ID haben wie die Topic ID in der anderen Tabelle. Da du zusätzlich die Topic ID in der Ursprungsabfrage auf 17 festnagelst kommt logischerweise maximal ein User heraus und der hat die ID 17.

Du hast aber auch in der anderen Tabelle eine user ID drin stehen und von der willst du, dass die mit der User ID in der usertabelle gleich ist (die User ID ist einer der beiden Fremdschlüssel in der phpbb_topics_posted und ist gleichzeitig Teil des Primärschlüssels der selben Tabelle).

Du willst die Festlegung auf Topic ID XY auch auf jeden Fall in der Abfrage lassen, denn du willst ja nicht alle User die jemals irgend einen Beitrag in einem Thema geschrieben haben, sondern dich interessiert ein konkretes Thema mit einer festen ID. Deine Abfrage oben liefert dir übrigens nicht alle User, sondern nur die, zu deren User ID es zufällig ein Thema mit der gleichen ID gibt. Wenn dein Forum, wie z.B. mein Forum weil es aus anderer Software importiert wurde, nicht mit Topic ID 1 startet sondern mit 10000 würden die ersten 9999 User nicht in der Liste auftauchen, auch wenn du die topic ID nicht einschränkst....

Was die Übersicht der Tabellenstruktur angeht: Wenn du sowas z.B. mit einem UML Format erstellen könntest, dann wäre das vielleicht für andere Nutzer auch sehr nützlich. Für phpBB 2 hat PhilippK sowas damals mal erstellt: ERM Modell phpBB 2.0 bzw. SERM Modell phpBB 2.0. Einige der Beziehungen haben sich nicht geändert, aber in phpBB 3.0 und 3.1 hat sich natürlich schon so einiges an der Datenbank getan.

Die Fremdschlüssel in den phpBB Tabellen tragen in den meisten (aber nicht in allen) Fällen die selbe Bezeichnung wie in den Ursprungstabellen.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „Coding & Technik“