Yael: Wenn keine Daten, dann bitte ausblenden

Einen wunderschönen guten Abend,

ist es möglich, vielleicht sogar ohne großen Aufwand, folgendes umzusetzten.

Wenn <?php echo $beschreibung; ?> leer ist, dann sollte dieser Bereich erst gar nicht erscheinen

  
<div class="rechts">  
        <p class="beschreibung">Beschreibung</p>  
   	<p class="detail"><?php echo $beschreibung; ?></p>  
</div>  

ist dieses ohne großen Aufwand möglich?

  1. Hello,

    Einen wunderschönen guten Abend,

    ist es möglich, vielleicht sogar ohne großen Aufwand, folgendes umzusetzten.

    Wenn <?php echo $beschreibung; ?> leer ist, dann sollte dieser Bereich erst gar nicht erscheinen

    <div class="rechts">
            <p class="beschreibung">Beschreibung</p>
        <p class="detail"><?php echo $beschreibung; ?></p>
    </div>

    
    >   
    > ist dieses ohne großen Aufwand möglich?  
      
    Na, ist denn schon wieder April?  
      
    ~~~php
      
      
    if (strlen($beschreibung) > 0)  
    {  
        echo  
        '    <div class="beschreibung rechts">'. "\r\n" .  
        "        <h2>Beschreibung</h2>\r\n" .  
        '        <p>' . htmlspecialchars($beschreibung) . "</p>\r\n"" .  
        "    </div>\r\n";  
    }  
      
    
    

    Die Klassen im Inneren habe ich absichtlich weggelassen, da Du die Elemente sauber per CSS-Nachfahrenselektor erreichenh kannst. Das "rechts" ist zwar auch nicht schön, aber wenn es mehrere Divs (links und rechts) geben sollte, vielleicht trotzdem notwendig.

    Für die Abrage käme auch noch "!empty()" in Frage. Dann kannst Du aber keine "0" ausgeben.

    Bitte achte auf die Kontextanpassung mit htmlspecialchars(). Variable Inhalte sollte man immer kontextbehandeln!

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    Die ultimative Seite für Selbermacher
    1. Hallo Tom,

      Bitte achte auf die Kontextanpassung mit htmlspecialchars(). Variable Inhalte sollte man immer kontextbehandeln!

      dieses htmlspecialchars hatte ich schon drin, wenn ich dann meinen Eintrag aufrufe werden die <br> nicht mehr umgewandelt, also habe ich diese wieder raus genommen.

      1. Hi,

        dieses htmlspecialchars hatte ich schon drin, wenn ich dann meinen Eintrag aufrufe werden die <br> nicht mehr umgewandelt,

        In deinen Eintrag gehören keine BR rein, da gehören normale Zeilenumbrüche rein – die dann bei der *Ausgabe* ggf. mittels nl2br in BR umgewandelt werden, nachdem htmlspecialchars angewendet wurde.

        also habe ich diese wieder raus genommen.

        Mach’s wieder rein.

        MfG ChrisB

        --
        Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
        1. Hallo,

          In deinen Eintrag gehören keine BR rein, da gehören normale Zeilenumbrüche rein – die dann bei der *Ausgabe* ggf. mittels nl2br in BR umgewandelt werden, nachdem htmlspecialchars angewendet wurde.

          das macht leider ein Editor, wenn man die Enter Taste drückt, darauf habe ich kein Einfluss.

          1. Hallo,

            das macht leider ein Editor, wenn man die Enter Taste drückt, darauf habe ich kein Einfluss.

            Bist du dir der Sicherheitsprobleme bewusst, die geschaffen werden, wenn deine Anwendung beliebigen HTML-Input von Nutzern erlaubt? Sind sich sämtliche Nutzer dieser Probleme bewusst? Werden die HTML-Eingaben bereinigt und durch eine Whitelist gefiltert?

            Grüße
            Mathias

            1. Hallo,

              Bist du dir der Sicherheitsprobleme bewusst, die geschaffen werden, wenn deine Anwendung beliebigen HTML-Input von Nutzern erlaubt? Sind sich sämtliche Nutzer dieser Probleme bewusst? Werden die HTML-Eingaben bereinigt und durch eine Whitelist gefiltert?

              Ich trage mein Text so in die Datenbank ein

              * Softdrinks
              * Warme Getränke
              * Alkoholausschank (nicht im Eintritt enthalten)
              * Nichtraucher- und Raucherbereich* Ruhezonen

              Dieser kommt aus einer Text Datei, KEINE Formatierungen. Die Ausgabe sieht so aus

              * Softdrinks* Warme Getränke* Alkoholausschank (nicht im Eintritt enthalten)* Nichtraucher- und Raucherbereich

              Mein PHP Code habe ich wie Tom es geschrieben hat umgesetzt

              <?php echo htmlspecialchars(nl2br($beschreibung)); ?>

              Was geht hier nun schief? Ich brauch einfach meine <br> sonst habe ich keine vernüftige Ausgabe.

              1. Hallo,

                <?php echo htmlspecialchars(nl2br($beschreibung)); ?>

                »In deinen Eintrag gehören keine BR rein, da gehören normale Zeilenumbrüche rein – die dann bei der *Ausgabe* ggf. mittels nl2br in BR umgewandelt werden, nachdem htmlspecialchars angewendet wurde.«

                So sprach ChrisB in weiser Vorhersehung deines Problems.

                Mathias

                1. Hallo,

                  »In deinen Eintrag gehören keine BR rein, da gehören normale Zeilenumbrüche rein – die dann bei der *Ausgabe* ggf. mittels nl2br in BR umgewandelt werden, nachdem htmlspecialchars angewendet wurde.«

                  Was sind normale Zeilenumbrüche? Wenn ich einen Text aus meinem Editor einfüge, sind Umbrüche drin, da ich jedes Wort in einer neuen Zeile sehe, oder?

                  htmlspecialchars habe ich ja wieder eingefügt und nl2br habe ich ebenfalls eingefügt.

                  1. »In deinen Eintrag gehören keine BR rein, da gehören normale Zeilenumbrüche rein – die dann bei der *Ausgabe* ggf. mittels nl2br in BR umgewandelt werden, nachdem htmlspecialchars angewendet wurde.«

                    Was ChrisB hier gesagt hat: Wende nl2br NACH htmlspecialchars an, nicht umgekehrt.

                    Sonst werden die <br>, die du mit nl2br einfügst, durch htmlspecialchars unschädlich gemacht. Das willst du nicht.

                    Allgemeiner Tipp: Antwortende hier im Forum halten sich kurz und präzise, daher ist es wichtig, Wort für Wort genau zu lesen, was sie schreiben.

                    Was sind normale Zeilenumbrüche? Wenn ich einen Text aus meinem Editor einfüge, sind Umbrüche drin, da ich jedes Wort in einer neuen Zeile sehe, oder?

                    Ja, das sind normale Zeilenumbrüche.

                    Mathias

                    1. »In deinen Eintrag gehören keine BR rein, da gehören normale Zeilenumbrüche rein – die dann bei der *Ausgabe* ggf. mittels nl2br in BR umgewandelt werden, nachdem htmlspecialchars angewendet wurde.«

                      Was ChrisB hier gesagt hat: Wende nl2br NACH htmlspecialchars an, nicht umgekehrt.

                      Sonst werden die <br>, die du mit nl2br einfügst, durch htmlspecialchars unschädlich gemacht. Das willst du nicht.

                      Egal, ich verstehe es nicht daher lasse ich es so wie es ist. Da ich jeden Eintrag prüfe kann ich schauen was jemand eingetragen hat.

                      1. Hello,

                        Egal, ich verstehe es nicht daher lasse ich es so wie es ist. Da ich jeden Eintrag prüfe kann ich schauen was jemand eingetragen hat.

                        Du musst doch nur die Reihenfolge der beiden Funktionen aendern. Geschachtelte Funktionen werden immer von innen nach aussen aufgeloest:

                        echo nl2br(htmlspecialchars($beschreibung));

                        Nun alles klar?

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                         ☻_
                        /▌
                        / \ Nur selber lernen macht schlau
                        Die ultimative Seite für Selbermacher
                        1. Hallo,

                          Du musst doch nur die Reihenfolge der beiden Funktionen aendern. Geschachtelte Funktionen werden immer von innen nach aussen aufgeloest:

                          echo nl2br(htmlspecialchars($beschreibung));

                          Nun alles klar?

                          Jupp, hab es auch so wie du geschrieben umgesetzt

                          <?php echo nl2br(htmlspecialchars($beschreibung)); ?>

                          Finde ich etwas unlogisch, warum von innen nach außen.

                          1. Hello,

                            Hallo,

                            Du musst doch nur die Reihenfolge der beiden Funktionen aendern. Geschachtelte Funktionen werden immer von innen nach aussen aufgeloest:

                            echo nl2br(htmlspecialchars($beschreibung));

                            Nun alles klar?

                            Jupp, hab es auch so wie du geschrieben umgesetzt

                            <?php echo nl2br(htmlspecialchars($beschreibung)); ?>

                            Finde ich etwas unlogisch, warum von innen nach außen.

                            Wie machst Du es denn in der Mathematik?

                            Liebe Grüße aus dem schönen Oberharz

                            Tom vom Berg

                            --
                             ☻_
                            /▌
                            / \ Nur selber lernen macht schlau
                            Die ultimative Seite für Selbermacher
                          2. Tach!

                            <?php echo nl2br(htmlspecialchars($beschreibung)); ?>
                            Finde ich etwas unlogisch, warum von innen nach außen.

                            Unlogisch wäre es andersrum. Aber es ist nicht so sehr das Innen und Außen, was hier eine Rolle spielt, sondern die Reihenfolge, in der die Teilausdrücke ausgewertet werden müssen, damit deren Ergebnisse an den nächsten Verarbeiter weitergegeben werden kann.

                            function x($param) {
                              ...
                            }

                            x(a + b);

                            Muss nun zuerst x() aufgerufen werden? Nein, erst muss a + b berechnet werden. Das Ergebnis muss an x() übergeben werden, denn die Funktion nimmt einen Wert entgegen, keinen Ausdruck, den sie selbst berechnet.

                            Und genauso ist es in deinem Fall nl2br() will einen Wert haben. Der kommt von htmlspecialchars(), und deshalb muss das zuerst aufgerufen werden.

                            dedlfix.

                          3. Hallo Yael,

                            <?php echo nl2br(htmlspecialchars($beschreibung)); ?>

                            Finde ich etwas unlogisch, warum von innen nach außen.

                            Es ist wichtig, dass du VERSTEHST, warum das so gemacht werden muss und was der substantielle Unterschied zu der anderen Reihenfolge ist.

                            Dieses Forum ist nicht der geeignete Ort, das jedem Einzelnen haarklein zu erklären. Das musst du dir bestenfalls selbst aneignen, denn nur so verstehst du es wirklich.

                            Ich rate dir, dir ein gutes Buch zu schnappen, das eine Einführung in die Programmierung generell und speziell die sichere Nutzung von PHP darstellt. Dir scheinen nämlich noch wichtige Grundlagen fehlen. Das meine ich nicht böse, sondern weil ich dir helfen will, *eigenständig* funktionsfähigen und sicheren Code zu schreiben.

                            Grüße
                            Mathias

                    2. Meines war doch richtig

                      <?php echo htmlspecialchars(nl2br($beschreibung)); ?>

                      Wenn ich in meiner Datenbank bin und auf schnell editieren gehe, werden wohl automatisch alle Umbrüche gelöscht. Wenn ich auf Datensatz Bearbeite gehe, dann mein Text einfüge, nun auf speichern klicke, bleibe die Umbrüche auch drin.

    2. Hallo Tom,

      if (strlen($beschreibung) > 0)
      {
          echo
          '    <div class="beschreibung rechts">'. "\r\n" .
          "        <h2>Beschreibung</h2>\r\n" .
          '        <p>' . htmlspecialchars($beschreibung) . "</p>\r\n"" .
          "    </div>\r\n";
      }

        
      Müsste bei `strlen($beschreibung)`{:.language-php} nicht auch ein htmlspecialchars mit rein? Noch eine letzte Frage, es gibt noch weitere Felder wie z.B. Straße, PLZ, Ort, Telefon, müssen die auch alle mit einem htmlspecialchars versehen werden?
      
      1. Hallo Tom,

        Ich bin zwar nicht der Angesprochene, aber ich gebe trotzdem meinen Senf dazu. ;)

        Müsste bei strlen($beschreibung) nicht auch ein htmlspecialchars mit rein?

        Es wird ja nur die Länge des Strings überprüft, um zu sehen ob er leer ist. Nichts wird ausgegeben, also sollte da auch nichts sein, was irgendwie problematisch sein könnte.
        Daher: Nein.

        Noch eine letzte Frage, es gibt noch weitere Felder wie z.B. Straße, PLZ, Ort, Telefon, müssen die auch alle mit einem htmlspecialchars versehen werden?

        Ja.
        Wenn du die Felder ausgeben möchtest, dann solltest du sie auch „entschärfen”.

        1. Hallo,

          Ja.
          Wenn du die Felder ausgeben möchtest, dann solltest du sie auch „entschärfen”.

          Alles klar dann füge ich dieses auch überall hinzu. Aber was ist bei einer Webseite? die beginnt mit http://www. bleibt hier alles beim alten?

          1. Aber was ist bei einer Webseite? die beginnt mit http://www. bleibt hier alles beim alten?

            Das ist schneller selbst getestet, als deine Frage geschrieben.

      2. Hello,

        if (strlen($beschreibung) > 0)
        {
            echo
            '    <div class="beschreibung rechts">'. "\r\n" .
            "        <h2>Beschreibung</h2>\r\n" .
            '        <p>' . htmlspecialchars($beschreibung) . "</p>\r\n"" .
            "    </div>\r\n";
        }

        
        >   
        > Müsste bei `strlen($beschreibung)`{:.language-php} nicht auch ein htmlspecialchars mit rein?  
          
        Nein, dort \_darf\_ ķeins rein, da der echte rohe Datenwert gemeint ist und kein Kontextwechsel stattfidet. Was ein Kontextwechsel ist, kannst Du im SelfWiki nachlesen.  
          
          
          
          
        Liebe Grüße aus dem schönen Oberharz  
          
          
        Tom vom Berg  
        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          
        
        -- 
         ☻\_  
        /▌  
        / \ Nur selber lernen macht schlau  
        [Die ultimative Seite für Selbermacher](http://getscript.de/)
        
    3. @@Tom:

      nuqneH

      Na, ist denn schon wieder April?

      Na, dein Code ist ja wohl ein Scherz!

      if (strlen($beschreibung) > 0)
      {
          echo
          '    <div class="beschreibung rechts">'. "\r\n" .
          "        <h2>Beschreibung</h2>\r\n" .
          '        <p>' . htmlspecialchars($beschreibung) . "</p>\r\n"" .
          "    </div>\r\n";
      }

        
      Dabei bietet PHP doch die [Möglichkeit](http://www.php.net/manual/de/control-structures.alternative-syntax.php), das lesbar zu notieren – ohne verschachtelte Anführungszeichen, Stringkonkatenation und "\r\n":  
        
      `<?php [code lang=php]if (strlen($beschreibung) > 0):`{:.language-html} ?>  
        <div class="beschreibung rechts">  
          <h2>Beschreibung</h2>  
          <p><?php `echo htmlspecialchars($beschreibung);`{:.language-php} ?></p>  
        </div>  
      <?php `endif;`{:.language-php} ?>[/code]  
        
      PHP in HTML einbetten, nicht andersrum!  
        
      Qapla'
      
      -- 
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      
      1. Hello Gunnar,

        Na, dein Code ist ja wohl ein Scherz!
        PHP in HTML einbetten, nicht andersrum!

        Ich verzeih Dir deinen Scherz. Denn auch ein Gunnar darf mal Witze machen :-P

        In diesem Thread ging es nicht um HTML in erster Linie, sondern um strukturierte Programmierung. "Wie kann ich den Programmablauf steuern?" Die Struktur (Steuerung) kann man bei deiner Notationsart nicht mehr oder nur sehr schwer erkennen.

        Aber da Du nun schon mal dabei bist, solltest Du bitte die anderen Notationsarten auch noch alle vorstellen und erläutern. Dann können wir anschließend vergleichen, was am leichtesten lesbar und wartbar ist.

        Und vergiss bitte nicht die Template-Variante, in der PHP und HTML ganz strikt voneinander getrennt bleiben, denn das sollte mMn das oberste Ziel bleiben! Die habe ich mir nur mit Mühe verkniffen, da ich nicht wusste, ob der OP überhaupt soweit mitlesen würde und ich daher nur _einen_ Schritt machen wollte, was sowieso nie gelingt.

        Auf andere implizite Schritte habe ich ihn daher hingewiesen. Ich hätte deinen (berechtigten) Angriff daher eher bezüglich der gewählten Klasse oder <h2> erwartet. Da hast Du wirklich Kompetenzen, die ich nicht einholen werde!

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        Die ultimative Seite für Selbermacher
        1. @@Tom:

          nuqneH

          In diesem Thread ging es nicht um HTML in erster Linie, sondern um strukturierte Programmierung.

          Aha. Was dann wohl wenn nicht gar MVC doch zumindest EVA beïnhaltet.

          "Wie kann ich den Programmablauf steuern?" Die Struktur (Steuerung) kann man bei deiner Notationsart nicht mehr oder nur sehr schwer erkennen.

          Die Steuerung des Programmablaufs hat in der Ausgabe (A bzw. V) auch nichts zu suchen.

          In Models und Controllern wird die alternative Schreibweise für Kontrollstrukturen kaum anzutreffen sein. HTML-Code auch nicht.

          Ich hätte deinen (berechtigten) Angriff daher eher bezüglich der gewählten Klasse oder <h2> erwartet.

          Single point of change. ;-)

          Qapla'

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. Hello Gunnar,

            In diesem Thread ging es nicht um HTML in erster Linie, sondern um strukturierte Programmierung.

            Aha. Was dann wohl wenn nicht gar MVC doch zumindest EVA beïnhaltet.

            "Wie kann ich den Programmablauf steuern?" Die Struktur (Steuerung) kann man bei deiner Notationsart nicht mehr oder nur sehr schwer erkennen.

            Die Steuerung des Programmablaufs hat in der Ausgabe (A bzw. V) auch nichts zu suchen.

            In Models und Controllern wird die alternative Schreibweise für Kontrollstrukturen kaum anzutreffen sein. HTML-Code auch nicht.

            Ich hätte deinen (berechtigten) Angriff daher eher bezüglich der gewählten Klasse oder <h2> erwartet.

            Single point of change. ;-)

            Eigentlich weiß ich jetzt immer noch nicht, was Du mit deinen Postings für den OP leisten willst. Was willst Du für den OP leisten?

            Dass Du mich nicht persönlich angreifen willst damit, weiß ich auch. Das würde die Charta des Forums missachten. Und das würdest Du niemals tun.

            Also frage ich mich, was Du uns (es lesen ja alle mit) eigentlich mitteilen willst. Was willst Du uns mitteilen?

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            Die ultimative Seite für Selbermacher
            1. @@Tom:

              nuqneH

              Eigentlich weiß ich jetzt immer noch nicht, was Du mit deinen Postings für den OP leisten willst. Was willst Du für den OP leisten?

              Für den OP? Der scheint um die bessere Alternative zu wissen.

              Und du weißt ebenso wie ich, dass ein Thread nicht nur für den OP da ist, sondern für alle Mitlesenden. Oder Später-im-Archiv-Nachlesenden.

              Qapla'

              PS: Fullquottel! ;-)

              --
              „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
              1. Für den OP? Der scheint um die bessere Alternative zu wissen.

                Ja, ich komme damit einfach besser klar, wenn ich mein HTML NICHT in PHP einbinden muss. Ich unterbreche lieber PHP und mache dann mit normalem HTML weiter und schließe PHP am Ende wieder.