Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit htmlentities

Einklappen

Neue Werbung 2019

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

  • Problem mit htmlentities

    Hallo, undzwar habe ich ein Problem, das PHP bei folgenden Skript nicht die Umlaute per htmlentities in die in HTML bestimmten Zeichencodes umändert.

    Code:
    PHP-Code:
    <html>
    <head>
    <link href="../../css/craftbootstrap.css" type="text/css" rel="stylesheet"></link>
    <body>
    <?
    // einlesen von Post´s
    $strTitel=htmlentities($_POST['strTitel']);
    $strNews=preg_replace('#<br />#','' , $_POST['strNews']);
    $strNews=nl2br($strNews);
    $strNews=htmlentities($strNews);
    $strDate=htmlentities($_POST['strDate']);
    $strTime=htmlentities($_POST['strTime']);
    $strAuthor=htmlentities($_POST['strAuthor']);
    // error auf 0
    $intError=0; ?>
    <fieldset>
    <legend>Neue Nachricht &uuml;berpr&uuml;fen</legend>
    <form name="input1" id="input1" method="post" action="<? echo($PHP_SELF) ?>">
    <label for="strTitel" class="left">Titel:</label>
    <? if ($strTitel!="") {
        echo $strTitel;
        ?><input name="strTitel" type="hidden" value="<? echo $strTitel; ?>" /><? 
    }
    else {
        $intError=1;
        ?><input type="text" name="strTitel" align="right" style="background: #ff0000;" /><? 
    } ?>
    <br />
    <label for="strNews" class="left">Nachricht:</label>
    <? if ($strNews!="") {
        echo "<br /><br />".$strNews;
        ?><input name="strNews" type="hidden" value="<? echo $strNews; ?>" /><? 
    }
    else {
        $intError=1;
        ?><textarea name="strNews" cols="30" rows="10" align="right" style="background: #ff0000;"></textarea><? 
    } ?>
    <br />
    <label for="strDate" class="left">Startdatum:</label>
    <? if ($strDate=="") { 
        $strDate=date('d.m.Y'); 
        $intError=1 
        ?><input name="strDate" type="text" size="10" maxlength="10"  align="right" value="<? echo $strDate; ?>" style="background: #ff0000;" /><?
    }
    else {
        $arrDatePart=explode(".", $strDate);
        if (checkdate($arrDatePart[1], $arrDatePart[0], $arrDatePart[2])) {
              echo ($strDate);
            ?><input name="strDate" type="hidden" value="<? echo $strDate; ?>" /><?
          }
          else {
              ?><input name="strDate" type="text" size="10" maxlength="10"  align="right" value="<? echo date('d.m.Y'); ?>" style="background: #ff0000;" /><? 
            $intError=1; 
          }
    } ?>
    (MM.DD.YYYY)<br>
    <label for="strTime" class="left">Startzeit:</label>
    <? 
    if ($strTime=="") { 
        $strTime=date('H:i'); 
        $intError=1 
        ?><input name="strTime" type="text" size="10" maxlength="10"  align="right" value="<? echo $strTime; ?>" style="background: #ff0000;" /><?
    }
    else {
        $arrTimePart=explode(":", $strTime);
        if (($arrTimePart[0]<=23) AND ($arrTimePart[0]>=0) AND ($arrTimePart[1]>=0) AND ($arrTimePart[1]<=59)) {
              echo $strTime;
            ?><input name="strTime" type="hidden" value="<? echo $strTime; ?>" /><?
          }
          else {
              ?><input name="strTime" type="text" size="10" maxlength="10"  align="right" value="<? echo date('H:i'); ?>" style="background: #ff0000;" /><?
          }
    } ?>
    (HH:MM)<br>
    <label for="strAuthor" class="left">Autor:</label>
    <? 
    if ($strAuthor!="") {
        echo $strAuthor;
        ?><input name="strAuthor" type="hidden" value="<? echo $strAuthor; ?>" /><?
    }
    else {
        $intError=1;
        ?><input type="text" name="strAuthor" align="right" style="background: #ff0000;" /><? 
    }
    ?>
    <br /><br />
    <label for="" class="left"></label>
    <? if ($intError==1) { ?>
        <input name="intStep" type="hidden" value="1" />
    <? } 
    else { ?>
        <input name="intStep" type="hidden" value="2" />
    <? } ?>
        <input name="strAction" type="hidden" value="new" />
    <? if ($intError==1) { ?>
        <input type="submit" name="Submit" value="Berichtigen" class="submit" />
    <? } 
    else { ?>
        <input type="submit" name="Submit" value="Speichern" class="submit" />
    <? } ?>
    </form>
    </fieldset>
    </body>
    </html>

  • #2
    Zitat von Nightloewe Beitrag anzeigen
    Hallo, undzwar habe ich ein Problem, das PHP bei folgenden Skript nicht die Umlaute per htmlentities in die in HTML bestimmten Zeichencodes umändert.
    Etwas genauer wäre Hilfreich. Input? Output? Var_dumps?

    Übrigens reicht auch ein htmlspecialchars wenn du keine Zeichensatzprobleme hast.
    [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

    Kommentar


    • #3
      Erwähnenswert ist auch die Änderung des Standardwertes von $encoding mit PHP 5.4. Aber ja, nachdem das systemabhängig ist braucht's da mehr Infos, siehe tkausl.

      Kommentar


      • #4
        Primär hat dein Code andere schwerwiegendere Probleme als html-escaping:
        - Short open tags sind pfui
        - PHP und HTML gemixt, auch pfui
        - PHP_SELF ist unsicher -> $_SERVER['SCRIPT_NAME']
        - HTML Dokumente müssen IMMER einen title-Tag besitzen und sollten Meta-Informationen über das Encoding des Dokuments mitliefern.

        Müsste ich mit Encodings tänzeln und den Source den du dort hast verwenden würde das wahrscheinlich so aussehen ( ohne Templating ):

        Tag.class.php
        PHP-Code:
        <?php

        /**
         * DOM based Tag Wrapper Class
         */
        class Tag extends ArrayObject
        {
            
            private 
        $tagName;

            public function 
        __construct($tagName)
            {
                
        $this->tagName $tagName;
            }

            public function 
        build(DOMDocument $dom)
            {
                
        $tag $dom->createElement($this->tagName);
                foreach ( 
        $this->getArrayCopy() as $attribute => $value ) {
                    
        $tag->setAttribute($attribute$value);
                }

                return 
        $tag;
            }

            public function 
        connect(DOMElement $element)
            {
                return 
        $element->appendChild($this->build($element->ownerDocument));
            }

            public static function 
        create($tagName, array $attributes = array())
            {
                
        $tag = new static($tagName);
                foreach ( 
        $attributes as $attribute => $value ) {
                    
        $tag->offsetSet($attribute$value);
                }

                return 
        $tag;
            }

            public static function 
        plot(DOMDocument $dom$tagName, array $attributes = array())
            {
                
        $tag = static::create($tagName$attributes);
                return 
        $dom->saveHtml($tag->build($dom));
            }

        }
        Das script selbst:
        PHP-Code:
        <?php

        /**
         * Config
         */

        $charset'utf-8';

        /**
         * Processing
         */

        require 'Tag.class.php';

        $impl = new DOMImplementation();
        $dom $impl->createDocument(null'html'$impl->createDocumentType('html'));
        $dom->encoding $charset;

        $head Tag::create('head')->connect($dom->documentElement);

        Tag::create(
            
        'link'
            [
                
        'href' => '../../css/craftbootstrap.css'
                
        'type' => 'text/css'
                
        'rel' => 'stylesheet'
            
        ]
        )->
        connect($head);

        Tag::create('meta', ['charset' => $charset])->connect($head);
        Tag::create('title')->connect($head);

        $body Tag::create('body')->connect($dom->documentElement);

        $fieldSet Tag::create('fieldset')->connect($body);
        $legend Tag::create('legend')->connect($fieldSet);
        $legend->appendChild(new DOMText('Neue Nachricht überprüfen'));

        $form Tag::create(
            
        'tag',
            [
                
        'name' => 'input1',
                
        'id' => 'input1',
                
        'method' => 'post',
                
        'action' => $SERVER['SCRIPT_NAME'],
            ]
        )->
        connect($fieldSet);

        $label Tag::create('label', ['for' => 'strTitel''class' => 'left'])->connect($form);
        $label->appendChild(new DOMText('Titel:'));

        /**
         * restliche tags ...
         */

        echo $dom->saveHtml();
        Sinn von DOMDocument ist es den Umgang mit Encodings und Notierungen soweit zu vereinfachen das man mit einer Option das Encoding des gesamten Dokuments beeinflussen kann. Die DOM-Implementierung entscheidet über die Feature die der SGML-Standard unterstützen soll.

        Die Tag-Klasse in diesem Fall ist nur ein Wrapper der ständig sich wiederholende Code-Blöcke zusammenfasst und durch kürzere ersetzt.

        Das was du bei dir tust ist Context-Bingo, du springst von HTML zu PHP und vice versa, das sieht nicht nur blöd im Syntax-Highlighting aus, das ist auch ziemlich mistig zu verstehen.

        Optionen bieten hier (atomare oder reguläre) Template-Engines, dort gliederst du die reguläre HTML-Definition mit Platzhalter und Escaping-Angaben in eine extra Datei aus und reduzierst das PHP Script auf das was es enthalten soll: PHP.

        Eine Umfangreiche und beliebte Template-Engine ist Twig: http://twig.sensiolabs.org/

        Eine für deine Zwecke und deine Fähigkeiten Ausreichende Template-Engine ist Plates, dort wird die Templating-Funktionalität von PHP hervorgehoben und erweitert: http://platesphp.com/

        Mein Sourcecode oben zeigt wie man DOM-basiert HTML-Dokumente via PHP zusammenbaut ohne dabei Rücksicht auf Quoting oder Encodings nehmen zu müssen. Diese Methode ist, wenn man HTML nicht besonders gut kennt, die einfachere Variante. Das Endergebnis dieser Methode ist, sofern man beachtet welche Tags miteinander Verschachtelt werden dürfen, in jedem Fall ein W3C-valides HTML-Document, welches in jedem Webbrowser gleich interpretiert wird.
        [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

        Kommentar

        Lädt...
        X