kungschu: HTML-Code einbinden.

Hallo.

Ich möchte in einer php-file (zB index.php) HTML-Code aus einer anderen .html-file ausgeben.

Was nehme ich dafür vorzugsweise?

include(), readfile() oder file_get_contents() ?

MfG, Kungschu.

  1. Kommt darauf an, ob du den Kode noch bearbeiten möchtest. Im regelfall aber sucht jemand wie du nach include();

    1. Hallo.

      Kommt darauf an, ob du den Kode noch bearbeiten möchtest. Im regelfall aber sucht jemand wie du nach include();

      Nein, ich möchte ihn lediglich ausgeben. Ist include() hierfür also am besten geeignet?

      MfG, Kungschu.

      1. Hello,

        Kommt darauf an, ob du den Kode noch bearbeiten möchtest. Im regelfall aber sucht jemand wie du nach include();

        Nein, ich möchte ihn lediglich ausgeben. Ist include() hierfür also am besten geeignet?

        Nein, include() ist dann evtuell sogar gefährlich.

        Wenn Dein File aus einer externen Datenquelle stammt, also nicht aus Deinem abgesicherten Serverbereich, dann könnte Dir jemand PHP-Code unterschieben und damit sehr schnell die Kontrolle über Deinen Teil des Servers übernehmen.

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

  2. Hello,

    Ich möchte in einem php-file (zB index.php) HTML-Code aus einem anderen .html-file ausgeben.

    Was nehme ich dafür vorzugsweise?

    Aus der Formulierung "aus einem anderen" entnehme ich, dass auch das PHP-Script HTML-Code ausgibt.
    Wenn dies der Fall ist, musst Du die beiden Ausgabeströme erst so miteinander vereinen, dass nur _ein_ <html>, <head>, <body> vorkommt.

    Anderenfalls müsstest Du auf Frames oder I-Frames ausweichen.
    Dann genügt auch readfile() für die Ausgabe des Dateiinhalts.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. Hallo.

      Danke dir für deine ausführliche Antwort.

      Ich präzisiere:
      Beispiel für die ausgebende Seite (ja, auch hier nur Ausgabe von HTML-Code):

      [...]
      <body>

      <?php

      ????????????????? ( Hier zB include('content.html') )

      ?>

      </body>
      </html>

      Bseipiel für die zu inkludierende (?) Seite (ohne head,body,etc.):

      <!-- file Anfang -->
      <h1>Willkommen auf example.org</h1>
      <p>bla bla bla</p>
      <!-- file-Ende -->

      MfG, Kungschu.

      1. Hello,

        Beispiel für die ausgebende Seite (ja, auch hier nur Ausgabe von HTML-Code):

        [...]
        <body>

        <?php

        readfile('content.html');  ## setzt voraus, dass die Datei vorhanden und lesbar ist.

        ?>

        </body>
        </html>

        Bseipiel für die zu inkludierende (?) Seite (ohne head,body,etc.):

        <!-- file Anfang -->
        <h1>Willkommen auf example.org</h1>
        <p>bla bla bla</p>
        <!-- file-Ende -->

        Ein readfile() reicht aus.
        Du kannst es ggf. noch verpacken in

        if(is_readable('content.html'))
          {
            readfile('content.html');
          }

        http://www.php.net/manual/en/function.is-readable.php

        Wenn an der Datei gleichzeitig von einem Anderen auch gearbeitet werden soll, während der Normaluser sie ich anzeigen lässt, müsstest Du aber eher

        $content_file = "textbausteine/content.htnl";

        $fh = fopen($content,'rb');                       ## Datei zum Lesen öffnen
          if ($fh)                                          ## wenn es geklappt hat
          {
            flock($fh, LOCK_SH);                            ## Fragen, ob Datei frei ist und gegen
                                                            ## Veränderung sperren
            $content = fread($fh, filesize($content_file)); ## Datei auslesen
            fclose($fh);                                    ## Datei schließen und Sperre aufheben
            echo $content;                                  ## Dateiinhalt ausgeben
          }
          else
          {
            echo "$content steht zur Zeit nicht bereit";
          }

        Dieses Verfahren hat den Vorteil, dass man Inhalte in der Datei (also im Lesepuffer) noch verändern kann, z.B. indem man mittels Regular Expression oder Str_Replace() <'-- DETAIL02 --> austauscht gegen einen anderen String, den man sich aus einer weiteren Datei oder Abfrage besorgt hat oder aus der Session. Das könnte z.B. der username sein.

        Außerdem muss man $content nicht sofort nach dem Auslesen ausgeben, sondern kann das ganz am Ende des PHP-Scriptes tun. So bekommt man Ordnung in seien Seiten.

        Die Technik mit dem Austauschen von Platzhaltern in den HTML-Bausteinen nennt man Template-Technik.

        Sie hat gegenüber dem Include den Vorteil, dass man die Templates auch von den Usern erstellen lassen kann. Das führt dann zwar eventuell zu einem HTML-Fehler, aber es kann Dir kein PHP-Code eingeschleust werden.

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. Hallo.

          Danke dir für deine Bemühungen. Ich werde sehen, inwieweit ich die Informationen verarbeiten kann ;-).
          Ja, die Datei soll auch während einer Nutzung durch einen User bearbeitet werden können.

          flock($fh, LOCK_SH);                            ## Fragen, ob Datei frei ist und gegen
                                                              ## Veränderung sperren

          In welchem "Zustand" ist eine Datei denn nicht "frei"?
          flock() ist mir nicht ganz klar, sprich die Formulierung lesende uns schreibende Verriegelung.

          MfG, Kungschu.

          1. Hello,

            Ja, die Datei soll auch während einer Nutzung durch einen User bearbeitet werden können.

            flock($fh, LOCK_SH);                            ## Fragen, ob Datei frei ist und gegen
                                                                ## Veränderung sperren

            In welchem "Zustand" ist eine Datei denn nicht "frei"?

            Wenn ein anderer User sie gerade verändert.
            Stelle Dir vor, Dein Prozess liest aus der Datei, während ein anderer Prozess gerade Daten darin ändert. Je nach Zugriffsmethode und Inhalt kann das verheerende Folgen für die Datenintegrität haben. Bei HTML-Files kommt dann eben einfach nur Blödsinn heraus, aber wenn es ich um Datenfiles mit verknüpften Daten oder um empfindliche Werte (z.B. Atomkraftwerk) handelt, dürfte sowas keinesfalls passieren.

            Bei Webseiten sehe ich nur ernsthafte Probleme, wenn es sich um Shops oder Fernsteuerungen, Zugangsberechtigungen usw. handelt.

            flock() ist mir nicht ganz klar,

            sprich die Formulierung lesende uns schreibende Verriegelung.

            Die Bezeichnung ist auch irreführend, aber schon ewig so gewachsen.

            Eigentlich besteht das Locking aus drei Stufen

            1. Ungesperrt
            2. Gesperrt gegen Erteilung der totalen Sperre (3) an andere Benutzer,
               also nur frei zum Lesen und zum Beantragen weiterer Sperren der Stufe 2
               durch andere User. Wenn kein _anderer_ Prozess eine Sperre (2) mehr innehat,
               darf der eigene auf (3) erhöhen
            3. Gesperrt gegen weitere Sperren durch andere Benutzer.
               Niemand bekommt eine (2) und schon gar keine (3), solange ein Prozess eine
               Sperre der Stufe (3) innehat.

            Sperren sollte man immer nur so kurz wie möglich.
            Sperren der Stufe (3) sollte man _sofort_ nach erfolgreichem Veränderungsvorgang wieder aufheben.

            Beim Schließen einer Datei mit fclose() werden die Sperren. die der Prozesse innehat, automatisch alle wieder aufgehoben

            Das Sperren mit flock() ist sogenanntes advisory Locking, wird also parallel zu den Zugriffsmethoden geführt. Wenn ein Prozess sich nicht an den Mechanismus hält, kann er auf die Datei zugreifen, obwohl sie "gesperrt" ist. Beim mandatory Locking ist dieser Mechanismus in die Zugriffsmethoden direkt eingebaut. Wenn man also als ordentlicher Mensch über das Betriebssystem auf die Dateien zugeift, dann kann man auf eine gesperrte Datei _nicht_ zugreifen, egal, ob man sich selber um Sperren kümmert, oder nicht.

            Du solltest bei der Erstellung Deines Managementsystems von vorneherein sauber arbeiten, und die Sperrmechanismen verwenden.

            Mehr dazu bei Interesse.

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. Hallo.

              Mein (funktionierender) Ansatz:

                
              $datei ="../contentindex.html";  
                
                                        $file=fopen($datei,"r+");  
                
                                                    if($file) {  
                
                                                 rewind($file);  
                                                 flock($file, LOCK_SH);  
                                                 fputs($file,"$ueberschrift \n $text");  
                                                 fclose($file);  
              
              

              etc....

              Ist daran etwas auszusetzen?

              Noch eine Frage zu .htaccess:
              Ich möchte ein Verzeichnis schützen. Nun habe ich in meiner Datei stehen:

                
              # htaccess  
              AuthType Digest  
              AuthName "bereich"  
              AuthUserFile users/.htusers  
              Require user USERNAME  
              
              

              Die File .htusers existiert natürlich im entsprechenden Verzeichnis. Es funktioniert aber nicht? (Hoster (all-inkl) unterstützt .htaccess)

              MfG, Kungschu.

              1. Hello,

                Mein (funktionierender) Ansatz:    #### Wirklich?

                $datei ="../contentindex.html";

                $file=fopen($datei,"r+");

                if($file)
                {
                   rewind($file);   ## wozu das? Direkt nach dem Öffnen steht man immer am Anfang

                ## Außerdem wäre das nutzlos _vor_ dem flock()

                flock($file, LOCK_SH);        ## zu schwach zum Schreiben!
                   fputs($file,"$ueberschrift \n $text");  ## falsch, wenn man in ein vorhandesnes

                ## File hineinschreibt!

                fclose($file);

                Ist daran etwas auszusetzen?

                Oh ja!

                Wenn man vor hat, ein bestehendes File mittels eines Write-Prozesses (also fwrite, fputs[1], etc) zu verändern, dann muss man es _vor_ dem Auslesen sperren, und zwar Exclusiv.

                Also

                File öffnen
                File exclusiv sperren
                File auslesen
                File im Buffer verändern
                File aus dem Buffer zurückschreiben
                File in der Länge anpassen
                File schließen und entsprerren

                Es ist immer derselbe Ablauf. da beißt keine Maus 'nen faden ab, auch nicht meine von bitworks :-)

                Zu .htaccess

                Auth Type "Digest" funktioniert meistens nicht
                Probier erstmal mit Auth Type "basic", was dann passiert.

                mehr nach Deiner Rückmeldung mit den Fehlermeldungen

                [1] bei bestehenden Files meistens ungeeignet

                Harzliche Grüße vom Berg
                http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau

                1. Hallo.

                  Wenn man vor hat, ein bestehendes File mittels eines Write-Prozesses (also fwrite, fputs[1], etc) zu verändern, dann muss man es _vor_ dem Auslesen sperren, und zwar Exclusiv.

                  Also

                  File öffnen

                  fopen()

                  File exclusiv sperren

                  flock($file, LOCK_SH) tut also nicht genau das?

                  File auslesen

                  also fread()?

                  File im Buffer verändern

                  wie?

                  File aus dem Buffer zurückschreiben

                  wie?

                  File in der Länge anpassen

                  wie?

                  File schließen und entsprerren

                  fclose(), nehme ich also an.

                  Zu .htaccess

                  Dafür habe ich heute keine Nerven mehr. Trotzdem Danke nochmals für deine ausführliche Hilfestellung den Tag über!

                  MfG, Kungschu.

                  1. Hello,

                    Wenn man vor hat, ein bestehendes File mittels eines Write-Prozesses (also fwrite, fputs[1], etc) zu verändern, dann muss man es _vor_ dem Auslesen sperren, und zwar Exclusiv.

                    Also

                    File öffnen
                    fopen()
                    File exclusiv sperren

                    #  flock($file, LOCK_SH)  ##tut also nicht genau das?  [1]
                      flock($file, LOCK_EX) ## DAS tut es jetzt?

                    File auslesen
                    also fread()?      ja
                    File im Buffer verändern

                    # wie?   Indem man an bestimmten Postionen etwas austauscht, überschreibt, einfügt, usw

                    File aus dem Buffer zurückschreiben

                    #   wie?  Satzzeiger zurück auf Anfang, ganzen Buffer schreiben, Länge des Files anpassen

                    File in der Länge anpassen

                    #  wie?  mit ftrauncate()

                    File schließen und entsprerren

                    fclose(), nehme ich also an.  ## Korrekt

                    [1] flock() ohne den Parameter LOCK_NB wartet solange, bis die Lockanforderung erfolgreich war. das kann auch solange sein, bis die maximale Scriptlaufzeit erreicht wurde. Dann wird das Script insgesamt rausgeschmissen und alle aktiven Opens und Locks werden automatsich besitigt.

                    Nur bei Argument LOCK_NB versucht das System nur einige Male gnaz kurz hintereinander, den Locking-Status zu erlangen. Wenn das in (typisch) 5 Versuchen im Millisekundenabstand nicht klappt, wird false zurückgegeben und mit dem nächsten Statement im Script weitergemacht...

                    Harzliche Grüße vom Berg
                    http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau

                    1. Hallo.

                      Also schreibe ich z.B.:

                        
                      $file = fopen(datei.html);  
                        
                      if ($file) {  
                        
                           flock(§file, LOCK_EX);  
                        
                           fread($file);  
                        
                      # Ich möchte am Anfang Daten einfügen, also (?):  
                           rewind($file);  
                        
                           fwrite($file, "$neuerEintrag");  
                        
                      
                      

                      File aus dem Buffer zurückschreiben
                      #   wie?  Satzzeiger zurück auf Anfang, ganzen Buffer schreiben, Länge des Files anpassen
                      File in der Länge anpassen
                      #  wie?  mit ftrauncate()

                      Hier weiß ich nun nicht, welche Befehle ich verwenden könnte. Etwa so?:

                        
                           rewind($file);  
                        
                      #ganzen Buffer schreiben ??????  
                        
                      #woher weiß ich, wie lange die File ist?  
                           ftrauncate($file, x);  
                        
                           fclose($file);  
                      }else{  
                      
                      

                      etc.

                      Wie du siehst, ist mir also vorallem der Schritt schreiben im Buffer und der Sinn hinter dem auslesen / festlegen der Größe der Datei unklar.?

                      MfG, Kungschu.

                      1. ello,

                        Also schreibe ich z.B.:

                        $file = fopen(datei.html);

                        if ($file) {

                        flock(§file, LOCK_EX);

                        fread($file);    ## wohin liest Du denn die Daten? In den Mülleimer?

                        Ich möchte am Anfang Daten einfügen, also (?):

                        rewind($file);            ## das ist hier zwar noch zu früh, aber nicht ganz falsch
                                                         ## Rewind gehört klassisch betrachtet zu Textdateien
                                                         ## fopen() öffnete aber eine Random Access Datei
                                                         ## PHP nimmt das aber nicht so genau :-((

                        fwrite($file, "$neuerEintrag");  ## Willst Du einfügen oder überschreiben?

                        !> > > > File aus dem Buffer zurückschreiben !

                        #   wie?  Satzzeiger zurück auf Anfang, ganzen Buffer schreiben, Länge des Files anpassen

                        File in der Länge anpassen
                        #  wie?  mit ftrauncate()

                        Wenn also am Anfang ein Satz eingefügt werden soll:

                        $buffer = $satz . CRLF . $buffer;

                        In "$satz" sind die neuen Daten
                        "CRLF" ist das für das OS gültige Satzendezeichen
                        "$buffer" enthält die Daten vom fread(), also aus der Datei.

                        Harzliche Grüße vom Berg
                        http://www.annerschbarrich.de

                        Tom

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                        Nur selber lernen macht schlau

                        1. Hallo.

                          Nun kann ich dir langsam nicht mehr folgen, meine minimalen php-Kenntnisse erschöpfen sich. Was ich bisher gelernt habe:

                          • Datei öffnen
                          • Datei sperren
                          • In Datei schreiben
                          • Datei schließen (und somit Sperre aufheben)

                          Was mir nicht klar ist:

                          • Wieso spielt die Größe der Datei eine so große Rolle?Weshalb kann ich sie nicht einfach öffen, am Anfang content einfügen und sie wieder schließen?

                          • Wie ich die Funktion ftrauncate() korrekt anwende?

                          Ich habe auch versucht, dieses aktuelle Posting zu verstehen, aber auch jetzt ist mir der ganze Vorgang noch nicht vollständig klar.

                          Nehme ich dein anderes Posting zur Hilfe, würde ich es jetzt so versuchen (bzw. interpretieren):

                            
                          #Datei zum schreiben öffnen  
                          $fh = fopen(content.html, 'r+');  
                            
                          # wenn das geklappt hat  
                          if ($fh) {  
                            
                               #Datei sperren  
                               $lock_ok = flock($fh, LOCK_EX);  
                            
                               #Datei lesen  
                               $file = fread($fh, filesize(content.html));  
                            
                               #Text einfügen  
                               rewind($file);  
                               fwrite($file,"$neuerInhalt");  
                            
                               #Dateizeiger zurück  
                               fseek($fh, 0, SEEK_SET);  
                            
                               #Buffer zurückschreiben, sprich schreibt in $fh den neuen content  
                               fwrite($fh, $file);  
                            
                               #Das verstehe ich jetzt nicht. Wird meine alter content jetzt nicht gelöscht?  
                               ftruncate($fh, strlen($file));  
                            
                               #schliessen  
                               fclose($fh);  
                          
                          

                          Wie sieht es damit jetzt aus? Wird es ;-) ?

                          MfG, Kungschu.

                          1. Hello,

                            - Wie ich die Funktion ftruncate() korrekt anwende?  ## File abaschneiden

                            #vorhandene Datei zum schreiben öffnen
                              $fh = fopen('content.html', 'r+');

                            wenn das geklappt hat

                            if ($fh) {

                            #Datei sperren
                                 $lock_ok = flock($fh, LOCK_EX);

                            #Datei lesen
                                 $file = fread($fh, filesize(content.html));

                            #Text einfügen

                            #      rewind($file);
                            #      fwrite($file,"$neuerInhalt");   ## woher kommt denn der neue Inhalt?

                            #Dateizeiger zurück

                            fseek($fh, 0, SEEK_SET);  ## ist besser als rewind() und bewirkt hier das Gleiche

                            #Buffer zurückschreiben, sprich schreibt in $fh den neuen content
                                 fwrite($fh, $file);

                            #Das verstehe ich jetzt nicht. Wird meine alter content jetzt nicht gelöscht?

                            #      Ja, durch Überscxhreiben mit neuem Content werden genau soviele Bytes gelöscht
                            #      vom alten Content, wie der neue lang ist.

                            ftruncate($fh, strlen($file));

                            #      Das macht man, um die Datei auf die Länge des neuen Contents zu kürzen, falls
                                   der alte länger war. Anderenfalls kann man sich das schenken.

                            #schliessen
                                 fclose($fh);

                            Harzliche Grüße vom Berg
                            http://www.annerschbarrich.de

                            Tom

                            --
                            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                            Nur selber lernen macht schlau

                            1. Hallo.

                              • Wie ich die Funktion ftruncate() korrekt anwende?  ## File abaschneiden

                              abaschneide? Ok, dann benötige ich das nicht. Ich möcht die alten Daten ja behalten.

                                
                              #vorhandene Datei zum schreiben öffnen  
                              $fh = fopen('content.html', 'r+');  
                                
                              # wenn das geklappt hat  
                              if ($fh) {  
                                
                                    #Datei sperren  
                                    $lock_ok = flock($fh, LOCK_EX);  
                                
                                    #Datei lesen  
                                    $file = fread($fh, filesize(content.html));  
                                
                                    #Text einfügen  
                                
                                       #sollte ich hier auch fseek verwenden (anstatt rewind) bzw. überhaupt notwendig?  
                                       rewind($file);  
                                       fwrite($file,"$neuerInhalt");   ## woher kommt denn der neue Inhalt? zB aus $_POST["text"], davor halt noch filtern etc.  
                                
                                    #Dateizeiger zurück  
                                    fseek($fh, 0, SEEK_SET);  
                                    #Buffer zurückschreiben, sprich schreibt in $fh den neuen content  
                                    fwrite($fh, $file);  
                                
                                    fclose($fh);  
                              }else{  
                              
                              

                              etc.

                              Passt es so nun? Ist filesize in fread() überhaupt noch notwendig?

                              MfG, Kungschu.

                              1. Hello,

                                Passt es so nun? Ist filesize in fread() überhaupt noch notwendig?

                                Nein. Du hättest doch nur lesen müssen.

                                #vorhandene Datei zum Lesen und Schreiben öffnen
                                  $fh = fopen('content.html', 'rb+');   ## rb+ ist noch besser!

                                # wenn das geklappt hat
                                  if ($fh)
                                  {
                                     #Datei sperren
                                     $lock_ok = flock($fh, LOCK_EX);

                                #Datei lesen
                                     $file = fread($fh, filesize('content.html'));

                                #Text einfügen
                                     $file = "neuer Text vorne dran \n" . $file . "neuer Text hinten dran\n";

                                #Dateizeiger zurück
                                     fseek($fh, 0, SEEK_SET);  ## ist besser als rewind() und bewirkt hier das Gleiche

                                #Buffer zurückschreiben, sprich schreibt in Handle $fh den neuen content $file
                                     fwrite($fh, $file);

                                ftruncate($fh, strlen($file));
                                     # Das macht man, um die Datei auf die Länge des neuen Contents zu kürzen, falls
                                       der alte länger war. Anderenfalls kann man sich das schenken.

                                #schliessen
                                     fclose($fh);

                                Schau es Dir nochmal in Ruhe an.
                                Wenn man nicht mit Kopie und Backup arbeiten will, sollte man es so machen.

                                Harzliche Grüße vom Berg
                                http://www.annerschbarrich.de

                                Tom

                                --
                                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                Nur selber lernen macht schlau

                                1. Hallo Tom.

                                  Vielen herzlichen Dank für deine Mühe. Das ist nicht selbstverständlich und in diesem Umfang auch eher die Ausnahme.
                                  Ich weiß es umso mehr zu schätzen.

                                  Es funktioniert nun einwandfrei.
                                  (Der Link zur Lösung für die Nachleser:
                                  https://forum.selfhtml.org/?t=150032&m=975139)

                                  Wie lässt es sich eigentlich realisieren, dass Backslashes genau so Ausgegeben werden, wie ich sie, beispielsweise, in die <textarea> eingebe? Wie zB bei einem Forumsbeitrag hier.

                                  Ein schönes Wochenende noch! Danke!

                                  MfG, Kungschu.