Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

Gelöst von JimTheLion

Zur Lösung
  • 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 von PVoss

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

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

  • 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. :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 :)

  • 2 Wochen später...

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.