webForumDet fria alternativet

Exekvera PHP-kod som är lagrad i en databas

PHPur PHP

8 svar · 532 visningar · startad av jme

Medlem sedan maj 20012 237 inlägg
Frågan#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.

Medlem sedan mars 20007 896 inlägg
#2

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.

Medlem sedan maj 20012 237 inlägg
#3

eval verkar inte gilla { och }.

Medlem sedan mars 20007 896 inlägg
#4

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!
Medlem sedan maj 20012 237 inlägg
#5

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.

Medlem sedan maj 20012 237 inlägg
#6
<?php
$arr = array(1,2,3);

foreach($arr as $el)
{
echo $el . "<br/>";
}

?>

resulterar i:

1
2
3
"; } ?>

Medlem sedan mars 20007 896 inlägg
#7

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("&lt;", "&gt;"), $b) . "<br />";
eval($b);
?>

Output:

foreach($a as $c) { echo $c . '<br />'; }
ett
tva
tre

Kan du visa kodsnutten som inte fungerade att evaluera?

Medlem sedan mars 20007 896 inlägg
#8

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.
Medlem sedan maj 20012 237 inlägg
#9

Ok, tack!

135 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)