EVAL FUNKTION ?



  • $file = implode('',file('content.php'));
    // " bereiten Probleme, deswegen ersetze ich sie hier einfach durch "
    // wenn du aber Tag-Attribute in " eingeschlossen hast klappt das so nicht mehr
    $file = str_replace('"','"',$file);
    eval ('$file = "'.$file.'";');
    


  • Ja das ist das Problem ich habe z.B. später einen normalen HTML Code darin..

    Das ist ja eben das Problem.

    Hat jemand dazu eine Idee ?



  • Theoretisch könntest du die " vorher durch irgendeine einmalige Kombination ersetzten, eval drüberlaufen lassen und anschließend die Ersetzung wieder rückgängig machen.

    $name = "Bierglas"; 
    $file = implode('',file('content.php'));
    $id = md5(uniqid(rand()));
    $file = str_replace('"',$id,$file);
    eval ('$file = "'.$file.'";'); 
    $file = str_replace($id,'"',$file);
    echo $file;
    


  • Oder du ersetzt direkt die ganzen Variablen (evtl. per Suche durchgehen) selber mittels str_replace o.ä. 🙄



  • Wenn ich mal melden dürfte: Vielleicht, damit der Aufwand nicht allzugroß wird, solltest du die <> einfach durch irgendetwas anderes ersetzen, oder mach den Text, der dazwischen steht, dick etc.

    Nur weil zwei eckige Klammern nicht so leicht darzustellen sind, sollte man für eine solche einfach Anwendung nicht so einen großen Aufwand betreiben.



  • die < und > machen ja gar keine Probleme, sondern die " - aber statt < und > sollte man besser < und > schreiben
    Außerdem kann man < und > in HTML-Code schlecht vermeiden :p - <b> bzw. <strong> - Mist schon wieder < und > 😃



  • Offenbar hab ich die Problematik noch nicht ganz verstanden. Was soll denn hinterher damit geschehen? Interessiert mich jetzt irgendwie...

    Also deine Lösung zeigt der bei mir doch jetzt mit Quotes an, so wies in der Datei steht?! Bitte klärt mich auf, sonst kann ich heute nach nicht schlafen 😃



  • hm also ok ich bin nun auch schon ein paar schritte weiter und habe folgendes vor:

    inxex.php:
    <?php
    include("includes/startseite.php");

    file=implode(,file(templates/main.tpl));file = implode('',file('templates/main.tpl')); id = md5(uniqid(rand()));
    file=strreplace(",file = str_replace('"',id,file);eval(file); eval ('file = "'.file.";);file.'";'); file = str_replace(id,",id,'"',file);
    echo $file;

    ?>

    includes/startseite.php:
    TITEL="Willkommenbeihttp://www.google.de";TITEL = "Willkommen bei http://www.google.de"; BILD = "hallo.gif";
    $TEXT = "Hallo";

    templates/main.tpl:
    <html>
    <head>
    <title>TITEL</titel></head><body><imgsrc="TITEL</titel> </head> <body> <img src="BILD" alt="" height="44" width="179" border="0"><br>
    $TEXT
    </body>
    </html>

    <<<>>>

    also wie man hoffentlich siet will ich ein ganz normalen html code haben und dort "platzhalter" an beliebiger stelle einstezten (z.B. $TITEL).

    die index.php soll nun die variablen aus includes/startseite.php laden und sie in templates/main.tpl einsetzen und dann alles komplett ausgeben.

    ->>>> was wichtig ist:
    och möchte später die varieblen auch z.B. aus includes/kontakt.php nehmen.
    also kann ich die seite ja so aufrufen - http://www.google.de/index.php?site=kontakt - und dann anfragen welchen inhalt site hat:

    <?php
    if(site == "kontakt")
    {
    include("includes/kontakt.php");

    file=implode(,file(templates/main.tpl));file = implode('',file('templates/main.tpl')); id = md5(uniqid(rand()));
    file=strreplace(",file = str_replace('"',id,file);eval(file); eval ('file = "'.file.";);file.'";'); file = str_replace(id,",id,'"',file);
    echo $file;
    }

    if(site == "startseite")
    {
    include("includes/startseite.php");
    file=implode(,file(templates/main.tpl));file = implode('',file('templates/main.tpl')); id = md5(uniqid(rand()));
    file=strreplace(",file = str_replace('"',id,file);eval(file); eval ('file = "'.file.";);file.'";'); file = str_replace(id,",id,'"',file);
    echo $file;
    }
    ?>

    ich hoffe so ist es etaws klarer geworden ------- hat nun jemand eine idee die ich den teil nach include hinbiegen kann - so das das auch mit den " richtig geht usw... oder hat jmd vielleicht eine bessere idee zu dem ganzen ?

    grüße.



  • Mit $id = '|'.md5(uniqid(rand())).'|'; klappt (also einfach ein Zeichen, was nicht in Variablennamen vorkommen darf) es schon besser (sonst hat er die Variablen nicht mehr richtig erkannt), also der Quelltext ist korrekt, allerdings zeigt der Browser nichts an 😕
    Ich hab den Text jetzt abgetippt, und dann klappt es 🙄 😕



  • komisch ist aber dass er zwar die richtige datei benutzt aber die variablen immer gleich bleiben!

    index.php:
    <?php
    if(site=="kontakt") { include("includes/kontakt.php"); file = implode('',file('templates/Main.tpl'));
    id=.md5(uniqid(rand())).;id = '|'.md5(uniqid(rand())).'|'; file = str_replace('"',id,id,file);
    eval ('file=".file = "'.file.'";');
    file=strreplace(file = str_replace(id,'"',$file);
    echo $file;
    }

    if(site=="startseite") { include("includes/startseite.php"); file = implode('',file('templates/Main.tpl'));
    id=.md5(uniqid(rand())).;id = '|'.md5(uniqid(rand())).'|'; file = str_replace('"',id,id,file);
    eval ('file=".file = "'.file.'";');
    file=strreplace(file = str_replace(id,'"',$file);
    echo $file;
    }
    ?>

    egal ob site startseite oder kontakt ist es ändert sich nichts - hat jemand den fehler gesehen ?

    lohnt es sich überhaupt das so zu realisieren - gibt es da andere/bessere möglichkeiten ?

    grüße.



  • Ich habe mich nochmal hingesetzt und eine alternative geschrieben:

    <?php
    include("includes/startseite.php");
    
    function GetTemplate($TplFile)
    {
    return str_replace("\"","\\\"",implode("",file($TplFile)));
    }
    
    function DoOutput($TplFile) 
    {
    echo $TplFile;
    }
    eval ("DoOutput(\"".GetTemplate("templates/Main.tpl")."\");");
    ?>
    

    Aber die komische Sache bleibt ! Kann es sein das der Server den Inhalt der Variablen noch im Speicher hat denn wenn ich includes/startseite.php veränder kommen immer noch die alten Sachen.



  • Wenn du so gut suchen könntest, wie du kopieren kannst, hättest du mal auf die Website des Urhebers geschaut:

    http://www.woltlab.info/de/forum/thread.php?threadid=18867
    http://www.woltlab.info/de/forum/thread.php?threadid=18021

    Machmal frage ich mich warum ich so sozial bin.



  • Der Fehler liegt nicht am Skript. Dein Browser(bestimmt der IE - der Mozilla ist so blöd nicht) legt die Seite in seinem Zwischenspeicher ab, und läd sie aus dem Zwischenspeicher und nicht neu.
    Es gibt aber einen Headerbefehl, der das unterbindet. Da musst du mal bei Google suchen.

    Edit:
    Ich würde die Templates nicht so einlesen wie du das machst. Das ist nämlich relativ lahm. fread() währe bedeutend schneller. (Ich habs mit einer 700mb großen Textdatei ausprobiert: implode(file()): timeout; fread(): 3sek;)



  • @ Wenn du so gut suchen könntest, wie du kopieren kannst, hättest du mal auf die Website des Urhebers geschaut

    Ja natürlich habe ich das kopiert aber ich wollte es doch eben für mich anpassen !

    @ Der Fehler liegt nicht am Skript. Dein Browser(bestimmt der IE - der Mozilla ist so blöd nicht) legt die Seite in seinem Zwischenspeicher ab, und läd sie aus dem Zwischenspeicher und nicht neu.

    Nein leider nicht! Ich benutze auch nicht den IE sondern Safari auf Mac OS X - und dann habe ich es auf einem anderen Computer ausprobiert und da taucht der gleiche Fehler auf --> ich habe auch keinen ProxyServer davor !!



  • Ich verstehe jetzt nichts mehr!

    index.php:
    <?PHP
    include("includes/startseite.php");
    include("templates/main.php");
    ?>

    includes/startseite.php:
    <?PHP
    $TITEL = "Hallo";
    ?>

    templates/main.php:
    <?PHP
    echo('<html><head><titel>'.$TITEL.'</titel></head></html>');
    ?>

    UND trotzdem steht in der variablen $TITEL noch der titel von gestern abend obwohl ich alles gelöscht habe ... sogar auf anderen computern in diesem netz. habe mir auch schon einen neue ip geben lassen.
    kann das was mit dem webserver zu tun haben ?



  • So ich habs. Was für ein Dicker Dummer Fehler. Lag an etwas anderem.

    Wen es interessiert hier ist eine Lösung:

    <?PHP
    
    		if($site == "startseite")
    		include("includes/startseite.php");
    
    		if($site == "kontakt")
    		include("includes/angebote.php");
    
    		else
    		include("includes/startseite.php");
    
    		function GetTemplate($TplFile)
    		{
    			return str_replace("\"","\\\"",implode("",file($TplFile)));
    		}
    
    		function DoOutput($TplFile) 
    		{
    			echo $TplFile;
    		}
    
    		eval ("DoOutput(\"".GetTemplate("templates/Main.tpl")."\");");
    ?>
    

    -- Über Verbesserungen würde ich micht natürlich freuen.

    Grüße.



  • DieLösung(Man^2) schrieb:

    <?PHP
        if($site == "startseite")
        include("includes/startseite.php");
    
        if($site == "kontakt")
        include("includes/angebote.php");
    
        else
        include("includes/startseite.php");
    ?>
    

    Dein if-else-syntax ist sehr gefährlich! In diesem Fall kannst du dir auf jeden Fall das erste if sparen 😉

    Lösung: entweder mit elseif oder mit verschachtelten if-else
    (ich würde dir auch { } empfehlen, um die Sachen eindeutig zuzuordnen - ist bei komplexem Code viel übersichtlicher)
    Hier würde ich aber ein switch bevorzugen:

    <?php
        switch($site)
        {
            case 'startseite':
                include("includes/startseite.php");
                break;
            case 'kontakt':
                include("includes/angebote.php");
                break;
            default:
                include("includes/startseite.php");
                break;
        }
    ?>
    

    Falls dein $site direkt aus dem Wert der URL stammt (register_globals uaf on): Nimm lieber $_GET['site'] (ab PHP >= 4.1.0) da register_globals bei neuen Versionen und bei vielen WebServern defaultmäßig auf off eingestellt ist



  • Hallo.
    Wen es interessiert ich habe es jetzt so gemacht:

    <?PHP
    
    	if(file_exists("includes/".$msite.".php"))
    	{
    		include("includes/".$msite.".php");
    	}
    
    	else
    	{
    	include("includes/startseite.php);
    	}
    
    		function GetTemplate($TplFile)
    		{
    			return str_replace("\"","\\\"",implode("",file($TplFile)));
    		}
    
    		function DoOutput($TplFile) 
    		{
    			echo $TplFile;
    		}
    
    		eval ("DoOutput(\"".GetTemplate("templates/20030810.tpl")."\");");
    
    ?>
    

    Er meldet mir nun zwar den Fehler:

    Warning:  Unexpected character in input:  '\' (ASCII=92) state=1 in index.php on line 14
    

    Aber ich denke das bekomme ich auch nor hin!

    Über weitere Kommentare würde ich mich freuen ....

    Grüße.



  • PS:
    Wenn das alles so funktioniert werde ich mich mit dem Komantar von Lutz beschäftigen:

    Edit:
    Ich würde die Templates nicht so einlesen wie du das machst. Das ist nämlich relativ lahm. fread() währe bedeutend schneller. (Ich habs mit einer 700mb großen Textdatei ausprobiert: implode(file()): timeout; fread(): 3sek;)

    Grüsse.



  • buffer=addslashes(file_get_contents(DeineDatei.ext));buffer=addslashes(file\_get\_contents('DeineDatei.ext')); result=eval('return "'.$buffer.'";');

    Gruß Jens


Anmelden zum Antworten