Mit PHP -> html teilweise ersetzen

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

  • Mit PHP -> html teilweise ersetzen

    Hallo zusammen

    Gibt es eine Möglichkeit nur einen Teil in einem mit PHP erstellten HTML File zu ersetzen wenn dieser Eintrag geändert wurde, ihn jedoch anhängen wenn er noch nicht vorhanden ist?
    Das mit dem Anhängen klappt ja ganz problemlos damit

    PHP-Code:
    <?php
     
    // Sichergehen, dass die Datei existiert und beschreibbar ist
    if (is_writable($filename)) {
     
         
    // Wir öffnen $filename im "Anhänge" - Modus.
         // Der Dateizeiger befindet sich am Ende der Datei, und
         // dort wird $somecontent später mit fwrite() geschrieben.
         
    if (!$handle fopen($filename"a")) {
              print 
    "Kann die Datei $filename nicht öffnen";
              exit;
         }
     
         
    // Schreibe $somecontent in die geöffnete Datei.
         
    if (!fwrite($handle$somecontent)) {
             print 
    "Kann in die Datei $filename nicht schreiben";
             exit;
         }
     
         print 
    "Fertig, in Datei $filename wurde $somecontent geschrieben";
     
         
    fclose($handle);
     
     } else {
         print 
    "Die Datei $filename ist nicht schreibbar";
     }
     
    ?>
    Nun sollte aber abgefragt werden ob im HTML <div id="Pferd"> schon vorhanden ist - wenn ja soll dieser Eintrag durch den neuen ersetzt werden wenn nicht soll er angehangen werden.

    Danke für eure Hilfe

    Nappi

  • #2
    Hallo,

    für solche Dinge kann ich nur dazu raten, das DOM zu benutzen und speziell für die Prüfung, ob etwas enthalten ist oder nicht, gibt es XPath.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      vielen dank

      xPath war genau das was ich gesucht habe

      danke nochmal

      Nappi

      Kommentar


      • #4
        Das mit xpath ist zwar eine sehr gute Idee nur bin ich anscheinend nicht gut genug um es richtig ein zu setzen!

        Ich habe es so versucht

        PHP-Code:
        <?php
        $name 
        $_POST['name'];
        $text $_POST['text'];
        $image $_POST['image'];
        $file $DOCUMENT_ROOT'member.html';

        $htmleintrag '
                        <div id="'
        .$name.'">
                        <h3>'
        .$name.'</h3>
                        <p><div>
                        <img style="float: left; padding: 5px; margin: 5px 5px 5px 5px; border: 2px solid black" src="'
        .$image.'" alt="'.$name.'" width="400px" />
                        </div>
                        <p>'
        .$text.'</p>
                        </div>'
        ;


        $doc = new DOMDocument();
        $doc->loadHTMLFile($file);

        $xpath = new DOMXpath($doc);

        $elements $xpath->query('*/div[@id="'.$name.'"]');

        if (!
        is_null($elements)) {
          foreach (
        $elements as $element) {
        PHP-Code:
        if (is_writable($file)) {
         
             if (!
        $handle fopen($file'a')) {
                  print 
        'Kann die Datei '.$file.' nicht öffnen';
                  exit;
             }
         
             if (!
        fwrite($handle$htmleintrag)) {
                 print 
        'Kann in die Datei '.$file.' nicht schreiben';
                 exit;
             }
         
             print 
        'Fertig, der Member '.$name.' wurde angelegt';
         
             
        fclose($handle);
         
         } else {
             print 
        'Die Datei '.$file.' ist nicht schreibbar';
         }

         
             
        $nodes $element->childNodes;
            foreach (
        $nodes as $node) {
                

        $htmleintrag preg_replace ('<div id="'.$name.'">''</div>' $htmleintrag);
         
            }
          }
        }
        ?> 
        Was passiert - > wenn das DIV vorhanden ist wird es neu geschriben das alte aber nicht überschrieben, wenn ich jetzt das ganze noch zwei weitere male machte kommt diese Fehlermeldung.

        Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: htmlParseStartTag: invalid element name in member.html, line: 45 in E:\xampp\htdocs\test\html.php on line 19

        Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: Unexpected end tag : div in member.html, line: 51 in E:\xampp\htdocs\test\html.php on line 19
        Ist das DIV noch nirgens im HTML file vorhanden macht das Script garnichts.

        Wo liegt mein Fehler?

        Danke für Eure Hilfe

        Nappi
        Zuletzt geändert von Nappi; 14.06.2010, 13:13.

        Kommentar


        • #5
          member.html enthält offenbar kaputte HTML-Code. Korrigiere diesen mit Hilfe von dem W3C-Validator.

          Kommentar


          • #6
            Bevor du loadHTMLFile aufrufst, solltest du
            PHP-Code:
            libxml_use_internal_errors(true); 
            setzen, damit die Fehlermeldungen nicht direkt ausgegeben werden.

            Die ganze preg_replace- und fwrite-Geschichte ist schlecht. Du solltest stattdessen direkt das DOM bearbeiten:

            PHP-Code:
            $found false;
            foreach (
            $xpath->query('//div[@id="'.$name.'"]') as $node) {
                
            $found true;
                
            // ersetzen:
                
            $node->parentNode->replaceChild($neuesElement$node);
                break;
            }
            if (!
            $found) {
                
            // einfügen:
                
            $irgendeinElternElement->appendChild($neuesElement);
            }
            // speichern
            $doc->save($file); // oder $doc->saveHTMLFile($file); 
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Vielen dan für Eure Antworten

              Ich habe das vorerst so übernommen und Arbeite mich da rein so das ich es auch wirklich verstehe

              Es kommt diese Fehlermeldung

              Fatal error: Call to a member function appendChild() on a non-object in E:\xampp\htdocs\test\html.php on line 33
              Line 33 ist

              Code:
              $doc->save($file); // oder $doc->saveHTMLFile($file);
              auch wenn ich

              Code:
              $doc->saveHTMLFile($file);
              verwende kommt die selbe Fehlermeldung
              warum kann er nicht speichern?

              Nappi
              Zuletzt geändert von Nappi; 14.06.2010, 13:02.

              Kommentar


              • #8
                Was steht denn auf Zeile 33? Hast du „$irgendeinElternElement“ auch durch was sinnvolles ersetzt?

                Edit zu deinem Edit: Nein, Zeile 33 ist die, auf der appendChild aufgerufen wird, nur rufst du es von etwas falschem auf.
                Zuletzt geändert von AmicaNoctis; 14.06.2010, 13:05.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Du bist zu schnell für mich

                  Ich habe meinen vorherigen Post nochmal geendert weil ich vergessen hatte zu schreiben was in line 33 steht - da hattest du schon geantwortet.

                  Echt klasse

                  Ja ich verwende Statische werte für die Variablen zum testen

                  PHP-Code:
                  $name 'Nappi';
                  $text 'mal testen ob das geht';
                  $image 'img1.png';
                  $file $DOCUMENT_ROOT'member.html'
                  Nappi

                  Kommentar


                  • #10
                    jetzt verstehe ich das erst! bzw nicht :/


                    $irgendeinElternElement wäre bie mir ja $htmleintrag oder ist das falsch?

                    Ich stehe total am schlauch und finde keinen weg runter

                    Nappi

                    Kommentar


                    • #11
                      Ich kann aus deinem Code leider nicht rekonstruieren, was genau du eigentlich vorhast. Wenn ich mich nicht irre, gehst du ziemlich falsch an die Sache ran und hast in Sachen XML generell noch Nachholbedarf. Daher weiß ich nicht, wo ich anfangen soll, dir zu erklären, dass du das alles wegwerfen kannst, um nochmal sauber anzufangen.

                      Als erstes beschreibst du jetzt bitte, was für ein Dokument das ist, wo diese Einträge rein sollen und an welcher Stelle nicht vorhandene eingefügt werden sollen. So wie du es mit fwrite machen willst, geht es einfach nicht, denn dann kommt z. B. sowas raus und das ist kein gültiges HTML:

                      HTML-Code:
                      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                      <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
                      	<head>
                      		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
                      		<title>...</title>
                      	</head>
                      	<body>
                      		...
                      	</body>
                      </html>
                      <div ...>...</div>
                      <div ...>...</div>
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        Du hast absolt recht mit xml kenn ich mich wirklich sehr schlecht aus.

                        Also ich verwende eine ein HTML file so zu ändern das wenn ein Neues Bild mit beschreibung geladen wird dieses in das HTML file eingetragen wird. Ist es aber schon einmal vorhanden und soll lediglich erneuert werden bzw eine neue Beschreibung eingefügt werden dann soll die Alte überschrieben werden.

                        das ist das HTML

                        HTML-Code:
                        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                        <html xmlns="http://www.w3.org/1999/xhtml">
                        <head>
                        
                        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
                        <title>Galerie</title>
                        </head>
                        <body>
                        
                        <div id="horse1">
                        	<h3>Pferd im Galopp</h3><p><div >
                        	<img style="float: left; padding: 5px; margin: 5px 5px 5px 5px; border: 2px solid black"
                        	src="/images/horse1.jpg"
                        	alt="Pferd im Galopp" width="400px" /></div>
                        	<p>Beschreibung des Bildes.</p>
                        </div>
                        
                        </body>
                        </html>
                        Die zwei äusseren DIV geben dan zu ändernden Rahmen.

                        Das ganze ist für eine Galerie.

                        Ich hoffe du kannst mir helfen denn bei allem probieren und lesen - suchen nach Tuorials und Manuels habe ich komplet den überblick verlohren.

                        Nappi

                        Kommentar


                        • #13
                          In diesem Fall ist $irgendeinElternElement also das body-Element und das erhältst du so (kannst es dann gerne auch überall(!) in $body umbenennen):

                          PHP-Code:
                          $irgendeinElternElement null;
                          foreach (
                          $xpath->query("/html/body") as $node) {
                              
                          $irgendeinElternElement $node;
                              break;

                          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                          Super, danke!
                          [/COLOR]

                          Kommentar


                          • #14
                            Irgendwie klappt das leider auch nicht :/

                            Sorry das ich dir so viel mühe mache.

                            Ich bekomme da die Fehlermeldung

                            Fatal error: Call to a member function appendChild() on a non-object in E:\xampp\htdocs\test\html.php
                            Und ich glaube das es im weiteren verlauf mit body nicht gehen wird da ja mehrere DIV ID in der HTML stehen werden und dann ersetzt er mir ja immer alle - oder liege ich da schon wieder falsch.

                            Nochmals sorry - ich bin eben ziemlich blond

                            Selma

                            Kommentar


                            • #15
                              Ich hab eine Positives resuldat - auch wenn es noch immer nicht das ist was es sein sollte aber zumindest tut sich etwas

                              Mein Momentanes Script - oder besser das von AmicaNoctis

                              PHP-Code:
                              <?php
                              $name 
                              $_POST['name'];
                              $text $_POST['text'];
                              $image $_POST['image'];
                              $file $DOCUMENT_ROOT'member.html';
                              $neuesElement '
                                              <div id="'
                              .$name.'">
                                              <h3>'
                              .$name.'</h3>
                                              <p><div>
                                              <img style="float: left; padding: 5px; margin: 5px 5px 5px 5px; border: 2px solid black" src="'
                              .$image.'" alt="'.$name.'" width="400px" />
                                              </div>
                                              <p>'
                              .$text.'</p>
                                              </div>'
                              ;

                              libxml_use_internal_errors(false); 
                              $doc = new DOMDocument();
                              $doc->loadHTMLFile($file);
                              $xpath = new DOMXpath($doc);
                              $found false;
                              foreach (
                              $xpath->query('/body/div[@id="'.$name.'"]') as $node) {
                                  
                              $found true;
                                  
                              // ersetzen:
                                  
                              $node->parentNode->replaceChild($neuesElement$node);
                                  break;
                              }
                              if (!
                              $found) {
                                  
                              $bodyElement null;
                              foreach (
                              $xpath->query("/body") as $node) {
                                  
                              $bodyElement $node;
                                  
                              // einfügen:
                                  
                              $bodyElement->appendChild($neuesElement);
                                  break;
                              } }

                              // speichern
                              $doc->save($file); // oder $doc->saveHTMLFile($file);  
                              ?>
                              Dabei kommt das raus

                              HTML-Code:
                              <?xml version="1.0" standalone="yes"?>
                              <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
                              <?xml version="1.0" standalone="yes"?>
                              <html><body>&#xD;
                              &#xD;
                              <div id="horse">&#xD;
                              	<h3>Pferd im Galopp</h3><p/><div>&#xD;
                              	<img style="float: left; padding: 5px; margin: 5px 5px 5px 5px; border: 2px solid black" src="/images/horse1.jpg" alt="Pferd im Galopp" width="400px"/></div>&#xD;
                              	<p>Beschreibung des Bildes.</p>&#xD;
                              </div>&#xD;
                              &#xD;
                              </body></html>
                              leider übernimmt es mir nicht mein HTML und die komischen zeichen - &#xD; - ka wo die her kommen.

                              Da ist noch etwas - bei jedem erneuten aufruf kommt ein ? und eine Zeile bei

                              <?xml version="1.0" standalone="yes"?>
                              <?xml version="1.0" standalone="yes"??>
                              <?xml version="1.0" standalone="yes"???>
                              hinzu, nach 3 aufrufen sieht es so aus wie oben.

                              Wo liegt jetzt noch der Fehler?

                              Nappi
                              Zuletzt geändert von Nappi; 14.06.2010, 19:55.

                              Kommentar

                              Lädt...
                              X