Petra: php in Variable

Hallo,

ich erstelle gerade eine Internetseite. Dabei habe ich eine Template-Datei, die den Titel und die linke (Navigations-)Spalte enthält. Für den Inhalt ist {INHALT} gesetzt. Dieser Zeichenstring wird dann auf den entsprechenden Seiten jeweils passend erstzt. Ein Beispiel für eine willlürliche Seite:

$einfuegen = file_get_contents('../template.php');  
$inhalt = '<div id="bla">Hallo, hier steht ein Inhaltstext</div>';  
$aenderung = str_replace("{INHALT}",$inhalt,$einfuegen);  
echo $aenderung;

Das ist alles auch wunderschön. Allerdings habe ich - etwas spät vermutlich - gemerkt, daß ich Probleme bekomme, wenn der Inhaltsteil selber php-Code mit Schleifen und allem drum und dran enthält.

Jetzt die Frage: Ich möchte wirklich nicht alles nochmal neumachen. Sind mittlerweile schon recht viele Seiten geworden. Gibt es eine Möglichkeit, die mir an der Stelle helfen könnte? Irgendwie nach dem Motto str_replace("{INHALT}",include(php-Datei),$einfuegen); oder so?

Danke für alle Ratschläge.
Gruß aus Frankreich,
Petra

  1. hi,

    etwas spät vermutlich - gemerkt, daß ich Probleme bekomme, wenn der Inhaltsteil selber php-Code mit Schleifen und allem drum und dran enthält.
    Gibt es eine Möglichkeit, die mir an der Stelle helfen könnte? Irgendwie nach dem Motto str_replace("{INHALT}",include(php-Datei),$einfuegen); oder so?

    Da hast du dich wahrscheinlich für das falsche Template-Engine entschieden, ausgereifte Systeme bieten dir die gewünschten Funktionalitäten, Template-Systeme.

    mfg

  2. Hello Petra,

    $einfuegen = file_get_contents('../template.php');

    $inhalt = '<div id="bla">Hallo, hier steht ein Inhaltstext</div>';
    $aenderung = str_replace("{INHALT}",$inhalt,$einfuegen);
    echo $aenderung;

      
    Du scheinst da irgendwie im "Niemandsland" stecken geblieben zu sein.  
    Denn wenn Du in den einzubindenen Inhalten wieder direkt PHP-Anweisungen stehen hast, dann wäre es besser gewesen, diese auch direkt in den Templates einzubinden:  
      
      <body ...><?php include('body.php'); ?></body>  
      
    Kompliziert wird es da nur, wenn die einzubindenen Teile Konstanten oder Funktionsdefinitionen  enthalten. Dann kann es zu einem redeclare/redefine-Error kommen. Ebenso muss man darauf achten, dass keine zirkulären Verläufe entstehen.  
      
      
      
      
    Liebe Grüße aus Syburg bei Dortmund  
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
    Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>
    
  3. $einfuegen = file_get_contents('../template.php');

    $inhalt = '<div id="bla">Hallo, hier steht ein Inhaltstext</div>';
    $aenderung = str_replace("{INHALT}",$inhalt,$einfuegen);
    echo $aenderung;

      
    Hallo Petra,  
      
    ich denke, [eval()](http://de.php.net/manual/de/function.eval.php) könnte das richtige für dich sein - damit kannst du PHP-Code innerhalb von Strings ausführen.  
      
    Allerdings haust du dir damit auch sehr schnell Sicherheitslücken in die Seite: Sobald Benutzer die Möglichkeit haben, eigenen Text zu speichern (der dann zb in einer MySQL-Datenbank abgelegt wird) und du ihn mit eval() ausführst, wäre es ja theoretisch möglich, dass die Benutzer dann zb statt einer Personenbeschreibung irgendeinen PHP-Code eingeben, der dann natürlich auch anstandslos ausgeführt wird. In so einem Fall muss der eingegebene Text natürlich überprüft werden, bevor er gespeichert wird.  
      
    Aber solange du nur deine eigenen Inhalte ausgibst, dürfte es kein Problem geben.  
      
    Beste Grüße  
    LarsSW
    
    1. Hello Lars,

      ich denke, eval() könnte das richtige für dich sein - damit kannst du PHP-Code innerhalb von Strings ausführen.

      das ist leider nicht ganz so einfach.
      Üblicherweise enthält so ein Template dann ja Passage, wie z.B.:

      <tr>
             <td><?php echo print_tabellenzelle(202,1); ?></td>
             <td><?php echo print_tabellenzelle(202,2); ?></td>
         </tr>

      Das kann man nicht einfach in einen String übernehmen und mit eval() auswerten.
      Hast Du es schon mal ausprobiert?

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  4. [latex]Mae  govannen![/latex]

    Das ist alles auch wunderschön. Allerdings habe ich - etwas spät vermutlich - gemerkt, daß ich Probleme bekomme, wenn der Inhaltsteil selber php-Code mit Schleifen und allem drum und dran enthält.

    du kannst z.B. mit ob_start() einen neuen Puffer bereitstellen, dann mit include die gewünschte Datei in diesen Puffer abarbeiten lassen und das Resultat mit ob_get_contents() in eine String einlesen, den du dann wie gewünscht statt des Platzhalters einsetzt. Dann noch den neuen Puffer mit ob_end_clean() leeren und entfernen.

    Cü,

    Kai

    --
    Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
    Sacrifice - the future has it's price
    And today is only yesterday's tomorrow
    selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
    1. [latex]Mae  govannen![/latex]

      Das ist alles auch wunderschön. Allerdings habe ich - etwas spät vermutlich - gemerkt, daß ich Probleme bekomme, wenn der Inhaltsteil selber php-Code mit Schleifen und allem drum und dran enthält.

      du kannst z.B. mit ob_start() einen neuen Puffer bereitstellen, dann mit include die gewünschte Datei in diesen Puffer abarbeiten lassen und das Resultat mit ob_get_contents() in eine String einlesen, den du dann wie gewünscht statt des Platzhalters einsetzt. Dann noch den neuen Puffer mit ob_end_clean() leeren und entfernen.

      Cü,

      Kai

      Das funktioniert!! Vielen vielen Dank!