EVAL FUNKTION ?



  • tachien.

    ich habe folgenden code in der datei 1.php:

    hallo du <"schluopnif"> mein name ist $name.
    

    nun möchte ich den die variable $name mit inhalt füllen und ausgeben, dazu habe ich einen code geschrieben aber der will nicht recht:

    <?php
    $name = "Bierglas";
    $file = include("1.php");
    eval ("\$file = \'$file\';");
    echo $file;
    ?>
    

    --
    also rauskommen soll dann:
    hallo du <"schluopnif"> mein name ist Bierglas.

    weis net ob man das schon template nennen kann - kann mir hier jemand helfen ? was habe ich falsch gemacht ?

    freundliche grüße > !



  • Du scheinst offenbar nicht zu wissen, was include macht (gibt nämlich keinen String zurück!)
    Schau dir mal file, file_get_contents und evtl. noch readfile oder die sonstigen file-Funktionen an 😉



  • doch doch das habe ich ja auch probiert.

    <?php
    
    $TITEL = 'Bierglas';
    $file = implode('',file('1.php'));
    
    eval ("\$file = \'$file\';");
    echo $file;
    
    ?>
    

    kannst du mich nicht korigieren - mir zeigen wie es richtig ist ?



  • bitte bitte helft mir ich komme da echt nicht weiter ?



  • $file = implode('',file('content.php'));
    // " bereiten Probleme, deswegen ersetze ich sie hier einfach durch &quot;
    // wenn du aber Tag-Attribute in " eingeschlossen hast klappt das so nicht mehr
    $file = str_replace('"','&quot;',$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.


Anmelden zum Antworten