Nikko: file_get_contens lokale Datei wie URL Ausgabe

Hallo,

gibt es eine Möglichkeit lokale Dateien mit zb. file_get_contens() zu handhaben wie eine URL Angabe?

Der Grund:

Ich binde eine variable PHP Seite mit HTML Ausgabe in ein Script ein. Einige Werte dieser Datei ändern sich je nach URL-Parameter.

Beispiel Datei xy.php:

----------------------------------------

Hallo  <?php echo $_GET['name'];?>

----------------------------------------

Binde ich nun diese Datei per file_get_contens('xy.php') ein, bringt das nichts. Als file_get_contens('xy.php?name=Sonja'), kommt es natürlich zu einem Fehler. Nur file_get_contens('http://domain.xyz/xy.php?name=Sonja'), bringt das gewünschte Ergebnis.

Natürlich hätte ich die Möglichkeit, die URL variabel oder fix mit anzugeben. Aber wenn es anders gehen würde, also file_get_contens oder ähnlicher Funktion beizubringen das zu handhaben wie über URL, wäre mal interessant zu wissen.

Gruss
Nikko

  1. Tach!

    gibt es eine Möglichkeit lokale Dateien mit zb. file_get_contens() zu handhaben wie eine URL Angabe?

    Ja, nützt dir aber in deinem Fall nichts. Ausgehend von der Dokumentationsseite zu file_get_contents() solltest du etwas nach unten rollen und dort dem Verweis auf Supported Protocols and Wrappers folgen. Da sind sie alle aufgelistet, die echten und unechten Protokoll-Angaben, unter anderem file://.

    Ich binde eine variable PHP Seite mit HTML Ausgabe in ein Script ein. Einige Werte dieser Datei ändern sich je nach URL-Parameter.
    Binde ich nun diese Datei per file_get_contens('xy.php') ein, bringt das nichts. Als file_get_contens('xy.php?name=Sonja'), kommt es natürlich zu einem Fehler. Nur file_get_contens('http://domain.xyz/xy.php?name=Sonja'), bringt das gewünschte Ergebnis.

    Das Dateisystem unterstützt keine Übergabe von Parametern auf diese Art und Weise. Über http:// zu gehen erzeugt einen neuen Request inklusive dessen Wasserkopf.

    Ein Parameter nützt dir außerdem bei file_get_contents('file://...') und anderen dateilesenden Funktionen nichts, weil dabei keine Ausführung stattfindet. Du bekommst den Inhalt, so wie er in der Datei steht geliefert. Wenn dieser Code enthält, der ausgeführt werden soll, wäre include/require angebracht. Und auch dafür brauchst du keine Parameterübergabe, weil der Code im aktuellen Kontext ausgeführt wird, also auf alle schon vorhanden Variablen zugreifen kann.

    Vielleicht solltest du darüber nachdenken, lieber Funktionen zu erstellen.

    dedlfix.

  2. Lieber Nikko,

    vielleicht so?

    $_h = sprintf(  
        file_get_contents('./path/file.htm'),  
        // Platzhalter in dieser Reihenfolge befüllen  
        htmlspecialchars($_GET['name']),         // User  
        htmlspecialchars($_GET['hundefutter']),  // Marke  
        date('Y-m-d')                            // heutiges Datum  
    );  
      
    echo $_h;
    

    Und das könnte in "file.htm" stehen:

    <html>  
        <head>  
            <title>User %1$s</title>  
        </head>  
        <body>  
            <h1>User <strong>%1$s</strong></h1>  
            <p>Aktueller Stand (%3$s) der Daten:</p>  
            <dl>  
                <dt>Lieblingshundefutter</dt>  
                <dd>%2$s</dd>  
            </dl>  
        </body>  
    </html>
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. hi,

      Lieber Nikko,

      vielleicht so?

      $_h = sprintf(

      file_get_contents('./path/file.htm'),
          // Platzhalter in dieser Reihenfolge befüllen
          htmlspecialchars($_GET['name']),         // User
          htmlspecialchars($_GET['hundefutter']),  // Marke
          date('Y-m-d')                            // heutiges Datum
      );

      echo $_h;

      ~~~php
        
      $foo = htmlspecialchars($_GET['foo']);  
      $bar = htmlspecialchars($_GET['bar']);  
      include("./path/to/file.phtml");  
      
      

      mit

        
      <p>[code lang=php]<?php echo $foo?>
      ~~~ oder mit ShortOpenTags `<?=$foo?>`{:.language-php}</p>  
      <!-- etc. pp. - ohne auf die Reihenfolge achten zu müssen -->  
      [/code]  
        
      mfg  
        
      tami
      
      1. Lieber tami,

        <p><?php echo $foo?>
        oder mit ShortOpenTags <?=$foo?>

        tja, da hast Du keine Template-Funktion in Deinem HTML-Code und keine "Befüllung" anhand von diversen Parametern.

        Ich schätze es sehr, wenn meine HTML-Dateien nur Platzhalter enthalten und ich sie mit file_get_contents einlesen kann, anstatt mir entweder das HTML mit PHP zu versauen, oder das PHP mit HTML.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hallo,

          Ich schätze es sehr, wenn meine HTML-Dateien nur Platzhalter enthalten und ich sie mit file_get_contents einlesen kann, anstatt mir entweder das HTML mit PHP zu versauen, oder das PHP mit HTML.

          ja sehe ich meistens genau so.

          Zu deinem Vorschlag, klar kann ich das entsprechend parsen, wobei ich dann in dem Fall aber http://php.net/manual/de/function.strtr.php  mit einem array-paar bevorzugen würde.

          Allerdings frage ich mich gerade dabei was passiert, glücklicherweise noch nie vorgekommen, wenn arrayname unerlaubte Zeichen enthalten würde, wie zb. Chinesisches Schrift oder so was, bin mir gar nicht sicher was ein Array Name so alles an Zeichen erlaubt, werde ich gleich mal nachschauen.

          In jedem Fall,
          Frage beanwortet, also lokale Dateien nicht duch XY Parameter behandelbar wie über URL.

          Danke
          Nikko

          1. Tach!

            Ich schätze es sehr, wenn meine HTML-Dateien nur Platzhalter enthalten und ich sie mit file_get_contents einlesen kann, anstatt mir entweder das HTML mit PHP zu versauen, oder das PHP mit HTML.
            ja sehe ich meistens genau so.

            Bedenke aber, PHP ist bereits eine Template-Sprache. Wenn du da noch eine Schicht einziehst, kann das bei einigen Aspekten (zum Beispiel Übersichtlichkeit, einfachere Handhabung) helfen, erhöht aber auch die Komplexität und damit die Fehleranfälligkeit.

            Allerdings frage ich mich gerade dabei was passiert, glücklicherweise noch nie vorgekommen, wenn arrayname unerlaubte Zeichen enthalten würde, wie zb. Chinesisches Schrift oder so was, bin mir gar nicht sicher was ein Array Name so alles an Zeichen erlaubt, werde ich gleich mal nachschauen.

            Variablennamen sind sehr variabel gestaltbar: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*. Das heißt - neben ASCII-Buchstaben, Unterstrich und Ziffern (außer erstes Zeichen) - alles was mit Bytewerten größer als 0x7F darstellbar ist, lässt sich verwenden. Ein erlaubter Variablenname wäre zum Beispiel $foo‒bar. Aber verwenden sollte man den nicht, weil er mit $foo-bar verwechselbar wäre. Hast du den Unterschied bemerkt? U+2012 und U+002D. UTF-8-kodiertes Chinesisch ist in PHP problemlos als Variablenname verwendbar.

            Für Array-Keys, falls du die gemeint hast, gibt es (nur Strings betrachtend) keine Einschränkungen.

            dedlfix.

        2. hi,

          Lieber tami,

          <p><?php echo $foo?>
          oder mit ShortOpenTags <?=$foo?>

          tja, da hast Du keine Template-Funktion in Deinem HTML-Code und keine "Befüllung" anhand von diversen Parametern.

          Diesen Satz verstehe ich nicht.

          Ich schätze es sehr, wenn meine HTML-Dateien nur Platzhalter enthalten und ich sie mit file_get_contents einlesen kann, anstatt mir entweder das HTML mit PHP zu versauen, oder das PHP mit HTML.

          Naja, PHP ist als Hypertext Preprozessor "gedacht". S.a. http://framework.zend.com/manual/1.12/de/learning.quickstart.create-layout.html (das application/layouts/scripts/layout.phtml).

          Es ist ja auch klar, dass eine Benamung der Variablen in numerischer Form Schwierigkeiten mit sich bringt. Deine Schüler nummerierst Du ja auch nicht durch, sonder sprichst sie mit Namen an. Der Namensgebung von Variablen kommt ja, so wie ich das verstehe, beim guten Codieren, was hier ja verbreitet werden sollte, eine besondere Bedeutung zu. Aussagekräftige Variablen- und Funktionsnamen erleichtern das Codelesen und auch die Teamarbeit.

          mfg

          tami

    2. હેલો

      ~~~php $_h = sprintf(
           file_get_contents('./path/file.htm'),

      ...

      );

        
      Wäre es nicht praktischer, die HTML-Bausteine in einer einzigen Datei als Variablen oder in einem array zu speichern? So könnte man alle HTML-Fetzen darein packen und direkt darauf zugreifen, ohne mit zig losen Dateien hantieren zu müssen. So mache ich es jedenfalls, wenn ich HTML-Fetzen brauche.  
        
      બાય
      
      -- 
       .  
      ..:
      
  3. Der Grund:

    Ich binde eine variable PHP Seite mit HTML Ausgabe in ein Script ein. Einige Werte dieser Datei ändern sich je nach URL-Parameter.

    Beispiel Datei xy.php:


    Hallo  <?php echo $_GET['name'];?>


    Hoho. Kontextwechsel? <?php echo htmlspecialchars($_GET['name']);?>

    Du hast also irgendwo ein PHP Skript, in dem Variablen mit Werten gefüllt werden. Das ist ok.

    Was Du willst ereichst Du mit include('xy.php');  require, require_once, include_once. vermutlich in dem Fall require der Kanditat: Sie muss da sein und könnte mehrfach includiert werden (wenn diese z.B. nur einen 'irre komplizierte' Tabellenzeile enthält.

    Ich gehe in solchen Fällen meist so vor:

    # ein paar Variablen:  
    $foo='bar';  
    $bar='foo';  
      
    # Funktionen  
    function tschuess() {  
        echo "<p>Mit freundlichen Grüßen</p><p>$conf['autor']</p><p>" . date('Y-m-d') . '</p>';  
    }  
      
    # ein Hash...  
    foreach ($_GET['name'] as $key => $value) {  
       $formularwerte[$key]=htmlespecialchars($value); # <- geeignet Dein Problem zu lösen  
    }  
      
    # und dann inkludiere ich:  
    require('xy.php');
    

    Die sieht dann natürlich so aus:
    ---
    <p>foo ist <php echo $foo;?>, bar ist  <php echo $bar;?><p>
    <p>wer hat auf &quot;<php echo $formularwerte['senden'];?>&quot; geklickt?</p>
    <php tschuess();?>,
    ---

    Tip: Wordpress funktioniert so.

    Jörg Reinholz

    1. Tach!

      ein Hash...

      foreach ($_GET['name'] as $key => $value) {
         $formularwerte[$key]=htmlespecialchars($value); # <- geeignet Dein Problem zu lösen
      }

      und dann inkludiere ich:

      require('xy.php');[/code]

      Die sieht dann natürlich so aus:

      <p>foo ist <php echo $foo;?>, bar ist  <php echo $bar;?><p>
      <p>wer hat auf &quot;<php echo $formularwerte['senden'];?>&quot; geklickt?</p>
      <php tschuess();?>,

      Das hat unter Umständen den Nachteil, dass man einen oder mehrere Werte in $formularwerte noch ein zweites Mal (oder gegebenenfalls öfter) vorhalten muss. Das ist dann der Fall, wenn der Kontext nicht HTML sondern ein Javascript-Block oder, noch komplexer, Javascript-Code in einem HTML-Attribut ist. Meine Empfehlung ist deshalb, die Behandlung erst direkt beim Einfügen vorzunehmen. Da sieht man besser, ob man die richtige verwendet hat und muss nicht aufpassen, welche Variable/Array-Element man einfügen muss.

      dedlfix.