[PHP] Problemen met Eval()

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De laatste paar weken ben ik bezig met een template class en een information class om makkelijk dynamische sites te maken. Nu wil ik in mijn config-file de waarde van een resultaat van een query kunnen bewerken, bijv. als er uit een query komt ID = 32 dan wil ik met een eval kunnen zeggen, als ID = 32 dan ID = 0, of zoiets dergelijks.

Een voorbeeld uit mijn config file:

'18' => Array (
'sqlname' => 'gzip',
'templatename' => 'ht_gzip',
'table' => 'httpdvhosts',
'process_show' => 'if (\$val == 0) \$e_val = 500; '),

Het belangrijke gedeelte hiervoor uit mijn template class:
$e_val = "Testing";
$val = mysql_result($result,$i, $columns[$x][sqlname]);
eval ("\$columns[$x][process_show];");
echo "<h1>E_val:" . $e_val . "</h1>";

Het werkt dus als volgt, in $val komt een waarde uit een row te staan, deze waarde wordt vervolgens bewerkt in process_show en wordt daarna verder gebruikt. Het vreemde is nu echter dat de eval niet schijnt te werken. Ik echo $e_val maar er komt niks te staan (null). Er zit dus ergens een fout in mijn eval-statement neem ik aan. Ik heb ook een initialisatiewaarde aan $e_val gegeven in mijn template-class en toen na eval() ge-echod maar toen kreeg ik nog steeds de init-waarde.. Iemand enig id misschien ?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Doe eens een echo van datgene wat je nu wilt 'evallen'.

Eigenlijk is dit een simpel gevalletje van goed debuggen...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat heb ik al een gedaan Janoz, daar komt gewoon precies hetzelfde uit wat ik wil evallen, dus het moet wel het juiste evallen lijkt me..

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je gebruikt single-quoted strings, die $ hoef je dus niet te escapen (sterker nog, lukt niet eens, wat er nu gebeurt is dat er letterlijk \$ in komt te staan ipv $)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nou, laat es zien wat je dan precies wilt evallen, want het is blijkbaar toch niet goed, ondanks dat je het verwacht :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Je gebruikt single-quoted strings, die $ hoef je dus niet te escapen (sterker nog, lukt niet eens, wat er nu gebeurt is dat er letterlijk \$ in komt te staan ipv $)
Oke, thx voor de tip, ik heb het nu veranderd als volgt:
(template-class)
$val = mysql_result($result,$i, $columns[$x][sqlname]);
$e_val = 10;
eval ('$columns[$x][process_show];');
echo "<h1>E_val:" . $e_val . "</h1>";

(config-file)
'18' => Array (
'sqlname' => 'gzip',
'templatename' => 'ht_gzip',
'table' => 'httpdvhosts',
'process_show' => 'if ($val == 0) $e_val = 500; '),

maar ik krijg nu nog steeds de init-waarde uit $e_val, namelijk 10 :( Er gebeurt dus niks met de eval() :(

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

En wat is de waarde van $val ?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja duh, je assignt die waarde helemaal niet aan $e_val

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
En wat is de waarde van $val ?
De waarde is 0, maar ik had eerst ook nog een else-statement, maar dat maakt niet uit.
ja duh, je assignt die waarde helemaal niet aan $e_val
Wel toch ? Ik heb ook geprobeerd een echo te doen op het laatst maar daarmee gebeurde ook niks..

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

doe es ipv die if iets van een echo erin, zoiets:
'process_show' => 'echo "if ($val == 0) $e_val = 500;"; '),

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ACM, heb ik nu geprobeerd, maar levert niks op. Ik zal even een groter stuk code geven misschien dat jullie nog iets fouts zien.

----- TEMPLATE CLASS ------
for ($i = 0; $i < mysql_num_rows($result); $i++)
{
$this->block .= $block_content[2];
$this->block = ereg_replace("NUM", "$i", $this->block); // numbers NUM for mod-use
for ($x=0; $x <= count($columns); $x++)
{
if (strpos($this->block, "{" . $columns[$x][templatename] . "}"))
{
$val = mysql_result($result,$i, $columns[$x][sqlname]);
$e_val = 10;
eval ('$columns[$x][process_show];');
echo "<h1>E_val:" . $e_val . "</h1>";
$this->block = ereg_replace("{" . $columns[$x][templatename] . "}", $val , $this->block);
}
// check if there are checkboxes, if so then check one
if (strpos($this->block, "{CHECKED_" . $columns[$x][templatename] . "_0}"))
{
if (mysql_result($result,$i, $columns[$x][sqlname]) == 0)
$this->block = ereg_replace("{CHECKED_" . $columns[$x][templatename] . "_0}"
, "CHECKED", $this->block);
elseif (mysql_result($result,$i, $columns[$x][sqlname]) == 1)
$this->block = ereg_replace("{CHECKED_" . $columns[$x][templatename] . "_1}"
, "CHECKED", $this->block);
}
}
}
-------TEMPLATE CLASS--------

-------CONFIG FILE----------
'18' => Array (
'sqlname' => 'gzip',
'templatename' => 'ht_gzip',
'table' => 'httpdvhosts',
'process_show' => 'echo "if ($val == 0) $e_val = 500;"; '),
---------CONFIG FILE---------

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

oh wacht, ik begreep je verkeerd. Nu pas begrijp ik wat je wilt doen

Verwijderd schreef op 21 januari 2003 @ 14:06:

eval ('$columns[$x][process_show];');


Nu probeert ie de code "$columns[$x][process_show];" te evallen. Wat komt daaruit? Juist, een string, met de waarde "if ($val == 0) $e_val = 500;". Dus eval () retourneert deze string

Maar dat wil jij niet, jij wilt dat die string juist wordt uitgevoerd. Dus je zult bovenstaande string aan de eval functie moeten voeren:

eval ($columns[$x]["process_show"]);

oh, en vergeet de quotes om process_show dus niet

iets zegt me dat jij de php docs nog eens door moet bladeren voor de algemene syntax van php ;)

[ Voor 9% gewijzigd door .oisyn op 21-01-2003 14:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Wil je $columns[$x]["process_show"] evalueren of wil je if ($val == 0) $e_val = 500; evalueren?

edit:

hmm, weer rijkelijk laat zie ik.....

[ Voor 24% gewijzigd door Janoz op 21-01-2003 14:55 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
:) THANX .oisyn ! Het werkt nu ! :) :)
Pagina: 1