Zum Inhalt springen

Frage

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

4 Antworten auf diese Frage

Empfohlene Beiträge

  • 1

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 1

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
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 :)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  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, 2020 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

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

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung