doppelte ausgabe vermeiden: wie?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • doppelte ausgabe vermeiden: wie?

    hallo zusammen
    ich bossle mir einen einfachen blog zusammen; ich bin kein php-profi und muss oft lange knobeln, bis ich was erreiche. hier aber bleibe ich stecken.

    problem:
    - zu einem bestimmten beitrag können kommentare abgegeben werden;
    - manuell "erteile" ich das ok, indem ich via db-verwaltung in der kommentartabelle die betr. id des beitrages einsetze, nämlich im kommentar.zu_id;
    - danach "hängt" sich der kommentar an den beitrag;
    - alles klappt bestens, nur: bei jedem kommentar erscheint der beitrag noch einmal. bei vier kommentaren erscheinen vier beiträge;

    die tabellen für beiträge und tabellen habe ich also "verknüpft", aber die ausgabe ist unsauber.

    ich wäre froh, wenn ich mein ziel erreichen kann, das so nahe liegt.
    hier der code, vereinfacht

    PHP-Code:
    <?
    $query = 'SELECT beitrag.id, kommentar.zu_id 
    FROM beitrag
    LEFT JOIN kommentar

    ON beitrag.id = kommentar.zu_id

    ORDER BY beitrag.datum DESC; 

    $result = mysql_query($query); 
    $num = mysql_numrows($result); 

    for ($i = 0; $i <$num; $i++) 

    $row = mysql_fetch_array($result); 

    echo "beitrag"; 
    echo "kommentar"; 
    }
    ?>
    Ich weiss, dass die Logik nicht stimmt. resp. dass das Resultat so aussehen muss (mit SELECT DISTINCT erreiche ich auch nichts). im prinzip muss ich ja die kommentare sammeln und dann an den einen beitrag hängen (mit array? aber wie?). nur: so tief geht mein wissen noch nicht.

    wer kann mir das verständlich erklären?
    ich frage, also habe ich nix gefunden
    mac osx

  • #2
    Um mal bei deiner Abfrage- und Darstellungslogik zu bleiben (sie tatsächlich nicht die optimalste ist, aber funktionieren sollte), musst du einfach die ausgabe des beitrags an eine bedingung knüpfen...

    nämlich soll der beitrag nur beim ersten schleifendurchlauf ausgegeben werden, danach nicht mehr....

    PHP-Code:
    <?
    $query = 'SELECT beitrag.id, kommentar.zu_id 
    FROM beitrag
    LEFT JOIN kommentar

    ON beitrag.id = kommentar.zu_id

    ORDER BY beitrag.datum DESC; 

    $result = mysql_query($query); 
    $num = mysql_numrows($result); 

    for ($i = 0; $i <$num; $i++) 

    $row = mysql_fetch_array($result); 

    if (!$i) echo "beitrag"; 
    echo "kommentar"; 
    }
    ?>
    zugegeben, das ist jetzt auch nicht gerade feiner code, aber Programmierer sind ja von Natur aus faul...

    was passiert: es wird nachgesehen, ob !$i (NOT $i) erfüllt ist, und nur dann wird $beitrag ausgegeben... durch den glücklichen umstand, dass eine Integer = 0 in boolscher Logik zu false evaluiert, wird die Abfrage if (!$i) genau dann erfüllt, wenn $i=0 ist ($i=0 -> false, ergo !$i -> true), was nur im ersten Schleifendurchlauf der Fall ist...

    greetz, high
    Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
    When everything else fails, manipulate the data...
    Beschriftungen / Großformatdruck / Werbemittel

    Kommentar


    • #3
      1. Query liest beitrag aus.
      2. Query die Kommentare.

      Fertig

      Kommentar


      • #4
        hallo zusammen

        danke für die antwort. ich habe den (mir bisher unbekannten) if (!$i)-befehl vor der beitragsausgabe gesetzt.

        jetzt zeigt es mir den ersten beitrag aus der tabelle - und dann weiter unten kommentare aus der kommentartabelle, die allerdings zu einem anderen beitrag gehören. also insofern wird schon nur ein beitrag gezeigt, allerdings auch nur einen einzigen, den ersten in der tabelle.



        @Tobiaz: habe ich schon versucht. resultat: zuerst die beiträge, dann die kommentare ausgegeben. reultat: zuerst alle beiträge, dann alle kommentare.

        PHP-Code:
        LEFT JOIN kommentar '
        ON beitrag.id = kommentar.zu_id'
        ORDER BY ..... '; 
        haut hier dann nicht hin, also die zuweisung eines kommentars zum jeweiligen beitrag.

        ich frage, also habe ich nix gefunden
        mac osx

        Kommentar


        • #5
          ahh okay.. missverständnis...

          um den gedanken von Tobiaz mal ausführlicher zu schreiben:

          hole beiträge
          while (noch ein beitrag da) {
          schreibe beitrag
          hole kommentrage where beitrag id= aktueller beitrag
          while (noch ein kommentar da) {
          schreibe kommentar
          }
          }

          so weit verständlich?

          oder aber du formulierts deine ausgabebedingung anders (mein Gedanke von vorher)... zum beispiel kannst du dir in einer hilfsvariablen merken, ob ein bestimmter beitrag schon hingeschrieben wurde... statt if (!$i) sowas wie
          hole alle beiträge mit kommentaren
          while (noch n ergebnis) {
          if ($beitragid!=$merker) schreibe beitrag
          $merker=$beitragid
          schreibe kommentar
          }

          greetz high
          Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
          When everything else fails, manipulate the data...
          Beschriftungen / Großformatdruck / Werbemittel

          Kommentar


          • #6
            In Blogs ist es meist üblich, dass auf der Übersicht nur die Beiträge stehen und die Kommentare erst auf wunsch, bzw. auf der Detailseite angezeigt werden.

            Kommentar


            • #7
              @ Tobiaz

              ja, hast recht

              aber neues zu probieren macht die welt abwechslungsreich, genau das wollte ich ja mit dem eigenbau. und der innere schweinehund muss überwunden werden, ich wills hinkriegen, weil ich kurz vor dem ziel bin.

              @highrise

              ... ansonsten könnte ich ja mal den code posten, aber zuerst versuche die neue variante.

              danke euch
              ich frage, also habe ich nix gefunden
              mac osx

              Kommentar

              Lädt...
              X