Templates aus Datenbank lesen und ausgeben

tequito

Mitglied
Hallo,

ich würde gern HTML- und PHP-Code der in der Datenbank liegt auslesen und ausgeben.

Leider bekomme ich immer Fehlermeldungen, selbst bei diesem Code:
PHP:
<?php

$string = 'Bierglas';
$name = 'Binding-Lager';
$str = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">Das ist mein $string, 
voll mit $name.<br>';

echo $str;
eval ("\$str = \"$str\";");
echo $str;

?>

erscheint folgende Fehlermeldung:
Code:
Das ist mein $string, voll mit $name.

Parse error: parse error, unexpected T_STRING in C:\Programme\xampp\htdocs\sys\be\out.php(10) : eval()'d code on line 2
Das ist mein $string, voll mit $name.

Was mache ich falsch?
 
Dann kommt das hier raus:
HTML:
Das ist mein $string, voll mit $name.
$str = "Das ist mein $string, voll mit $name.
";Das ist mein $string, voll mit $name.

Aber was soll mir das sagen?
 
Besser siehst du es vielleicht so:

PHP:
<?php
$str="<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">Das ist mein $string, 
voll mit $name.<br>";
?>
...das ist es, was eval() versucht auszuführen.

Die Anführungszeichen in dem String müssen escaped werden...sie verursachen den Fehler.
Tun kannst du das bspw. per [phpf]addcslashes[/phpf]

Dann sieht es so aus:
PHP:
<?php
$str="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">Das ist mein $string, 
voll mit $name.<br>";
?>
...den Unterschied erkennst du schon am Syntaxhighlightning. Alles Rot==Alles String :)
 
Mein Vorschlag:
PHP:
<?php

    $string = 'Bierglas';
    $name = 'Binding-Lager';
   
    $str = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
               "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
               Das ist mein $string, voll mit $name.<br>'; 
            
    //Mit htmlspecialchars() werden bestimmte Sonderzeichen in den 
    //dafür vorgesehenen HTML-Code umgewandelt. 
    $str = htmlspecialchars($str,ENT_COMPAT );
       
    //Mit get_html_translation_table() kannst Du auf die intern genutzte 
    //Zeichentabelle zugreifen, welche von den Funktionen htmlspecialchars() 
    //und htmlentities() als Grundlage für die Zeichenformatierung genommen wird
    $mod = get_html_translation_table(HTML_SPECIALCHARS);

    eval ("\$str = \"$str\";");
    $mod = array_flip($mod);
    $str = strtr($str,$mod);
    echo $str; 
?>
 
Du solltest dir aber wirklich überlegen, ob du das Gewünschte nicht auch anders realisieren kannst. Denn eval() ist wie ein Freibrief – auch für Code Injections.
Rasmus Lerdorf soll einmal gesagt haben: „If eval() is the answer, you're almost certainly asking the wrong question.“
 
Mal anders gefragt, vielleicht kannst du mir einen Tipp geben oder die Augen öffnen.

Bei einem CMS kann man im Backend Templates, Module (=Extensions) etc. anlegen, die mittels PHP bestimmte Dinge ausführen. Die Module müssen ja in der Datenbank gespeichert werden. Wenn ich diese nun aus der Datenbank lese, wie sollen diese dann anders ausführbar gemacht werden?

Wie würdest du denn an die Sache herangehen bzw. das "Problem eval()" umgehen?
 
Den Quellcode für jeden Aufruf erst noch von einer Datenbank abzufragen, ist sehr ineffizient. Öffnet dir das die Augen?
 
Es wäre ja auch möglich die Seiten zu cachen.

Nein, leider nicht. Du schreibst immer nur Stichworte, das hilft mir leider gar nicht.
 
Zurück