Veröffentlicht 13. Oktober 20204 j 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
13. Oktober 20204 j Lösung 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 13. Oktober 20204 j von PVoss
13. Oktober 20204 j 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
13. Oktober 20204 j 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. 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
14. Oktober 20204 j Autor 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. 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 :)
26. Oktober 20204 j 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?
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.