Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
[PHP5] eval problem [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
[PHP5] eval problem


 
UzumakiNaruto
19-07-2008, 16:05 
 
hi leute,

evtl liegt auch nur ein verständnisproblem vor :dontknow:

Inhalt einer PHP-Datei in einen String schreiben TRUE
PHP-Code aus dem String ausführen TRUE
"Ausgabe" mittels return zurückgeben FALSE

eval gibt sofort sein ergebnis sofort aus .. aber DAS ist nicht in meinem interesse .. wüsstet ihr dort eine möglichkeit?
Den so bin ich im moment an der gleichen stelle wie ich mit include gewesen wäre.

thx schonmal im voraus

 
Blackgreetz
19-07-2008, 16:10 
 
Wenn ich dich richtig verstanden habe, suchst du:

ob_start

mfg
ps: geht auch beim include..

 
UzumakiNaruto
19-07-2008, 16:15 
 
thx .. sieht schonmal super aus.

dann muss ich in der funktion die das return erwartet nur noch ob_end_flush() ausführen?!?!?!


scheint so nicht zu klappen :confused:



class LoadContent
{
#[...]
public function LoadContent($module_name, $file_name = "")
{
#[...]
$template_content = new Template(LoadConfig::getData("theme_dir")."template_content.html");
$template_content->replace("title", $module_name);
$template_content->replace("text", $this->getModule());
echo $template_content->echo_template();
}

private function getModule()
{
return $this->checkModule();
ob_end_flush();
}

private function checkModule()
{
#[...]
}

private function loadModule($path_to_file)
{
$fp = fopen($path_to_file, 'r');
while ($file = fgets($fp))
{
$input .= $file;
}
fclose($fp);

ob_start();
eval($input);
}
}

 
Blackgreetz
19-07-2008, 16:18 
 
Wenn es so im Manual steht -hust-

 
UzumakiNaruto
19-07-2008, 16:24 
 
Original geschrieben von Blackgreetz
Wenn es so im Manual steht -hust-

so wie ich das will will php das nicht ... eval schreibt es dennoch sofort

 
Blackgreetz
19-07-2008, 16:25 
 
dann wäre es eventuell sinnvoll etwas code zu zeigen...

mfg

 
UzumakiNaruto
19-07-2008, 16:28 
 
Original geschrieben von Blackgreetz
dann wäre es eventuell sinnvoll etwas code zu zeigen...

mfg

richte mal deine augen nach oben .. dort findest du welchen :D

 
Blackgreetz
19-07-2008, 16:35 
 
Falls sie mit dem Puffer-Inhalt weiter arbeiten möchten, müssen sie diesen erst per ob_get_contents() zwischen speichern bevor sie ob_end_flush() aufrufen, da dadurch der Puffer geleert wird.

Diese Funktion ähnelt ob_get_flush(), liefert aber nur den Erfolgsstatus statt des aktuellen Pufferinhalts zurück.


Dies sagt php.net zu ob_end_flush() ...

Wolltest du das, oder den Inhalt?
Dachte mein -hust- wäre eindeutig, falls ich dich richtig verstanden hatte..

Btw: Warum schreibst du deine Funktion in PHP4/5 statt 5? ..

..Ich weiß allerdings nicht, ob solch eine Output Controll auch bei Klassen funktioniert und hab auch gerade keine Lust, es selber zu testen..

mfg

 
UzumakiNaruto
19-07-2008, 16:43 
 
ich möchte verhindern das eval vorschnell den inhalt sendet ... sondern eigentlich den rückgabewert von eval als return übergeben .. damit ich das ganze in das template-system bekomme.

also php5 ist installiert .. und so ganz bin ich nicht mit den versionsunterschieden vertraut, den ich denke du erkennst am programmcode die vermeindliche php-version.

auch das ob_get_contents() hatte mir nichts gebracht


ob_start();
eval($input);


funktioniert ja schon nicht ... den wenn ich weder ob_get_contents() und ob_end_flush() benutze, kommt dennoch der inhalt von eval .. und zwar als echo sofort.

 
onemorenerd
19-07-2008, 16:44 
 
Nach einem return kannst du dir jeglichen weiteren Code sparen. Er wird niemals ausgeführt.

Imho ist es sehr schlechter Stil, in einer Methode das Output Buffering zu starten und in einer anderen zu beenden, auch wenn beide Methoden private sind. Damit erzwingst du, dass beide Methoden immer paarweise und in richtiger Reihenfolge aufgerufen werden. Dieser Zwang drückt sich aber nirgendwo aus, man muss schon den Code kennen. In einem Jahr wirst du ihn selbst nicht mehr im Kopf haben und ich wünsche viel Spaß beim Debugging. ;)

Last but not least ist die Methode loadModule() doch eigentlich nichts anderes als ein require. Wieso baust du das so umständlich nach?

 
UzumakiNaruto
19-07-2008, 16:48 
 
Original geschrieben von onemorenerd
Nach einem return kannst du dir jeglichen weiteren Code sparen. Er wird niemals ausgeführt.

Imho ist es sehr schlechter Stil, in einer Methode das Output Buffering zu starten und in einer anderen zu beenden, auch wenn beide Methoden private sind. Damit erzwingst du, dass beide Methoden immer paarweise und in richtiger Reihenfolge aufgerufen werden. Dieser Zwang drückt sich aber nirgendwo aus, man muss schon den Code kennen. In einem Jahr wirst du ihn selbst nicht mehr im Kopf haben und ich wünsche viel Spaß beim Debugging. ;)

Last but not least ist die Methode loadModule() doch eigentlich nichts anderes als ein require. Wieso baust du das so umständlich nach?

das ob_start() etc kannte ich bis eben nicht und kenne somit vor und nachteile des ganzen spieles nicht.

include/require erfüllen meine anforderungen ja nicht, da include/require SOFORT ausgeben und nicht zu einem zeitpunkt wenn ich es wünsche und ich somit den inhalt an eine bestimmte stelle im template-system bekomme

 
3DMax
19-07-2008, 16:50 
 
ist es denn so schwer?


ob_start();
include_once($file);
$parsed_content = ob_get_contents();
ob_end_clean();

 
UzumakiNaruto
19-07-2008, 16:58 
 
Original geschrieben von 3DMax
ist es denn so schwer?


ob_start();
include_once($file);
$parsed_content = ob_get_contents();
ob_end_clean();


schwer nicht .. aber anscheinend nicht die lösung meines problemes
jetzt habe ich aber den inhalt der php datei an der richtigen stelle .. aber wenn ich den dann mit eval "ausführen" lasse wird er wieder als eche ausgegeben und ist nicht mehr an der richtigen stelle.

 
3DMax
19-07-2008, 17:14 
 
Original geschrieben von UzumakiNaruto
... aber anscheinend nicht die lösung meines problemes
jetzt habe ich aber den inhalt der php datei an der richtigen stelle .. aber wenn ich den dann mit eval "ausführen" lasse wird er wieder als eche ausgegeben und ist nicht mehr an der richtigen stelle.
verstehe ich nicht, mit dem schnipsel erhälst du den php-interpretierten inhalt und eval ist überflüssig.

 
Blackgreetz
19-07-2008, 17:16 
 
@Uzumaki: include ^= fopen + eval ... wenn du so willst

ps: geht auch beim include..

Hatte ich schon ganz am Anfang gesagt :/

mfg

 
UzumakiNaruto
19-07-2008, 17:34 
 
das ist mir an sich alles klar .. das problem ist aber .. ich bekomme den inhalt der php datei angezeigt und NICHT das ergebnis.


function a(){echo "asd";}a();


das ist der inhalt der php datei (zum schnellen test) und ich bekomme genau das wieder angezeigt.


private function loadModule($path_to_file)
{
ob_start();
include($path_to_file);
$parsed_content = ob_get_contents();
ob_end_clean();
echo $parsed_content #gleiche ausgabe
return $parsed_content;
}

 
3DMax
19-07-2008, 17:38 
 
Original geschrieben von UzumakiNaruto
das ist mir an sich alles klar .. das problem ist aber .. ich bekomme den inhalt der php datei angezeigt und NICHT das ergebnis.


function a(){echo "asd";}a();

äh, php-tags stehen aber schon drum? :rolleyes:
bei nem include wechselt der parser erstmal in den html-modus.

 
UzumakiNaruto
19-07-2008, 17:42 
 
Original geschrieben von 3DMax
äh, php-tags stehen aber schon drum? :rolleyes:
bei nem include wechselt der parser erstmal in den html-modus.

alter nein .. das kann es nicht sein ... für eval hatte ich diese tags entfernt und deshalb hatte es auch nur mit include + eval funktioniert ... soviel "rauch" um nichts.

@blackgreetz
jetzt würde ich von dir gerne noch wissen wieso du der meinung warst ich würde php4/5 programmieren??? wenn will ich ja auch was lernen :D

 
Blackgreetz
19-07-2008, 18:05 
 
Guckst du: http://www.php.net/manual/de/language.oop5.decon.php

 
UzumakiNaruto
19-07-2008, 18:13 
 
alte gewohnheit :D ... meine anderen 5 klassen arbeiten bereichts mit __construct ... auch wenn ich den sinn nicht verstehe ob klassenname als funktion oder __construct als funktion ... oder gibt es dort große änderungen???

 
Blackgreetz
19-07-2008, 18:23 
 
Original geschrieben von UzumakiNaruto
.. oder gibt es dort große änderungen???

Wieso sollte es, wenn es die gleiche Aufgabe erfüllen soll? O.o
PHP hats einfach in der V5 so eingeführt.
Sollen eben vereinheitlicht werden, obwohls ja in den anderen Sprachen auch mit Name geht...

mfg


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:09 Uhr.