J jme Medlem sedan maj 2001 2 237 inlägg Frågan 1 aug. 2008 08:56 #1 Hej.
Kan man på nåt sätt enkelt exekvera on the fly PHP-kod som är lagrad i en databas, utan att först spara den i filsystemet och sedan köra include?
Det är inte bara ren PHP-kod utan även HTML-kod.
S SPiN Medlem sedan mars 2000 7 896 inlägg https://www.php.net/eval
Om det är blandat med HTML så se bara till att ha inneslutande PHP-taggar i koden som ska evalueras.
J jme Medlem sedan maj 2001 2 237 inlägg eval verkar inte gilla { och }.
S SPiN Medlem sedan mars 2000 7 896 inlägg Hm. Det beror ju till en viss del på hur informationen i databasen ser ut, men just måsvingar ska eval() klara av.
Exempel:
<?php
$a = "wee!";
$b = "if(\$a == 'wee!') { echo '\$a är wee!'; } else { echo '\$a är inte wee!'; }";
echo $b;
eval($b);
?>
Output:
if($a == 'wee!') { echo '$a är wee!'; } else { echo '$a är inte wee!'; }
$a är wee!
J jme Medlem sedan maj 2001 2 237 inlägg Hmm, jag testade med en foreach-loop och då visades sista } som klartext. Måste koden vara på en rad då isf?
Loopen jag testade med var utspritt på flera rader.
J jme Medlem sedan maj 2001 2 237 inlägg <?php
$arr = array(1,2,3);
foreach($arr as $el)
{
echo $el . "<br/>";
}
?>
resulterar i:
1
2
3
"; } ?>
S SPiN Medlem sedan mars 2000 7 896 inlägg Nej, det måste inte vara på en rad. Följande fungerar också utmärkt:
<?php
$a = array("ett", "tva", "tre");
$b = "foreach(\$a as \$c) {\n
echo \$c . '<br />';\n
}";
echo str_replace(array("<", ">"), array("<", ">"), $b) . "<br />";
eval($b);
?>
Output:
foreach($a as $c) { echo $c . '<br />'; }
ett
tva
tre
Kan du visa kodsnutten som inte fungerade att evaluera?
S SPiN Medlem sedan mars 2000 7 896 inlägg
jme skrev:
<?php
$arr = array(1,2,3);
foreach($arr as $el)
{
echo $el . "<br/>";
}
?>
resulterar i:
1
2
3
"; } ?>
Det är för att eval() är redan i "PHP-mode". Med andra ord ska <?php och ?> bort från den kodsnutten.
Om du vill skriva HTML utanför PHP-taggarna kan det se ut så här:
a.txt:
?>
<h1>
<?php
$normalMode = "Så här ser det ut i vanligt läge.";
$h1Mode = "Så här ser det ut i rubrikläge.";
echo $h1Mode;
?>
</h1>
<?php
echo $normalMode;
Notera att jag stänger PHP-läget direkt i filen, och öppnar det igen i slutet.
evaluate.php:
<?php
$b = file_get_contents("a.txt");
eval($b);
?>
Output:
<h1>Så här ser det ut i rubrikläge.</h1>
Så här ser det ut i vanligt läge.