Zum Inhalt springen
  • 0

SQL, PHP


Frage

Geschrieben

Hallo,

ich bin erst seit kurzem in Ausbildung und hoffe, dass die Frage nicht unnötig ist.

Ich arbeite an einem Forum mit Themen, Beiträgen und Kommentaren. Die Problematik ist, dass alle Kommentare unter einem Beitrag gebündelt ausgegeben werden sollen und eben nicht "foreach" (Das wäre momentan: Beitrag1, Kommentar1; Beitrag1, Kommentar 2 ...). Über 1:n Beziehungen usw. habe ich mich reichlich informiert, aber in meinem eigenen Code hilft das leider nicht. Der Auszug aus dem Quellcode zeigt den Beginn der Schleife, weiter unten wird nur ausgegeben,  der input für weitere Kommentare erzeugt und danach die Schleife geschlossen. Ich habe versucht, die Kommentare unter der Schleife ausgeben zu lassen, das funktioniert aber leider alles überhaupt nicht. Kann mir jemand zumindest einen Denkanstoß in die richtige Richtung gebe? Danke :)

Screenshot (20).png

5 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
Geschrieben (bearbeitet)

Moin,

dein Code ist anfällig für SQL-Injections, ist aber schon nah an der sicheren Lösung dran.

$sql = ".... WHERE thema.id = ? ....";

$res = $pdo->prepare($sql);
$res->execute([$idthema]);

https://de.wikipedia.org/wiki/Prepared_Statement

Falls $idthema vom Integer-Datentyp ist, würde ein explizites Casten auch dafür sorgen, dass die Abfrage sicher ist.

$sql = ".... WHERE thema.id = " . (int) $idthema . " ...";

 

Wenn du bei deinem aktuellen Ansatz, Beiträge und Kommentare innerhalb einer Abfrage zu holen, bleiben möchtest, kannst du einen Gruppenbruch verwenden: https://php-de.github.io/jumpto/gruppenbruch/

Das würde dann dem Beispiel 1B entsprechen.

 

Die Alternative ist, zuerst die Beiträge aus der Datenbank zu holen und anschließend die jeweiligen Kommentare über weitere Abfragen abzuholen.

Ahand der Zeilenanzahl sieht es aus, als würdest du noch nicht nach EVA-Prinzip arbeiten und noch die Datenverarbeitung/Abholung und die Ausgabe vermischen. Dann ist der zweite Ansatz wahrscheinlich einfacher umzusetzen.

 

Bearbeitet von PVoss
  • 1
Geschrieben

Sofern es auch in größeren Abfragen lesbar bleiben soll, würde ich noch über benannte Parameter nachdenken. Außerdem kannst du, siehe Beispiel 2, dann zusätzlich den Datentypen direkt mitgeben. Das vermeidet in jedem Fall die unschönen, vielen Fragezeichen oder auch das Casten mitten im Query.

$sql = "SELECT ... WHERE thema.id = :thema_id";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(':thema_id' => $idthema));   

https://www.php.net/manual/de/pdo.prepare.php

$sql = "SELECT ... WHERE thema.id = :thema_id";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':thema_id', $idthema, PDO::PARAM_INT);

https://www.php.net/manual/de/pdostatement.bindparam.php

  • 0
Geschrieben

Halbschlaf lässt grüßen.

$res = $pdo->prepare($sql);
$res->execute();

foreach ($res as $row) {
  ...
}

Der Vollständigkeit halber also:

Kein Wunder, dass das nicht geht, du holst die Daten gar nicht richtig ab. :D

Nach dem $res->execute(); sollte etwas stehen wie:

$result = $res->fetch(PDO::FETCH_ASSOC);

foreach ($result as $row) {
  ...
}

https://www.php.net/manual/en/pdostatement.fetch.php

  • 0
Geschrieben
vor 18 Stunden schrieb Visar:

Halbschlaf lässt grüßen.


$res = $pdo->prepare($sql);
$res->execute();

foreach ($res as $row) {
  ...
}

Der Vollständigkeit halber also:

Kein Wunder, dass das nicht geht, du holst die Daten gar nicht richtig ab. :D

Nach dem $res->execute(); sollte etwas stehen wie:


$result = $res->fetch(PDO::FETCH_ASSOC);

foreach ($result as $row) {
  ...
}

https://www.php.net/manual/en/pdostatement.fetch.php

Der Code an sich funktioniert, aber die Sortierung ist mein großes Problem. Die Zuordnungen funktionieren auch, es geht mir nur darum, ob ich das noch weiter verzweigen muss oder eine separate Abfrage für die Kommentare darunter erstellen muss. Vielen Dank für die Antworten :)

  • 0
Geschrieben

SQL gibt immer Result-Sets zurück, also quasi Tabellen. Was du also tun musst - insbesondere, wenn du mehrere Entitäten gemeinsam abfrägst wie z.B. content + comment - ist diese Tabellenstruktur wieder auflösen.

CONTENT_ID CONTENT_TEXT COMMENT_ID COMMENT USERNAME
1 Beitrag 1 1 Kommentar 1 Darth Vader
1 Beitrag 1 2 Kommentar 2 Leia Organa
1 Beitrag 1 3 Kommentar 3 R2D2
2 Beitrag 2 4 Kommentar 2.1 Darth Vader

CONTENT_ID + CONTENT_TEXT brauchst du nur 1x, bekommst du aber 3x. Du musst das also im PHP herausfiltern. Das geht z.B., indem du über die CONTENT_ID vergleichst

# mein PHP ist etwas eingerostet - keine Gewähr für 100% korrekt Syntax ;)

$currentContentId = -1;
foreach ( $res as $row ) {
  ...
  if ( $row["contentId"] != $currentContentId ) {
    # Beitrag ausgeben
  }
  $currentContentId = $row["contentId"];
  # Kommentar ausgeben
}

Hilft dir das weiter?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...