Problem med eval()

This is a discussion on Problem med eval() within the Produktion af websider ved brug af php (dk.edb.internet.webdesign.serverside.php) forum.

Problem med eval()

Postby David Konrad on Thu Nov 13, 2008 2:45 pm

Hej,

Jeg overser nok noget ret fundamentalt. Jeg gemmer i et
administrationssystem tekst der vises på en hjemmeside, teksten kan markeres
som enten ren HTML eller indeholdende PHP.

"Teksten" rendereres således ($pagename er et navn, $isPHP er ovenstående
flag, $pageHTML er selve teksten) :

function include_text($text){
while(substr_count($text, '<?php') > 0){
list($html, $text) = explode('<?php', $text, 2);
echo $html;
list($code, $text) = explode('?>', $text, 2);
eval($code);
}
echo $text;
}

if ($pagename!='') {
switch ($isPHP) {
case false : echo $pageHTML; break; //udskriv ren HTML
case true : include_text($pageHTML); break; //fortolk PHP-tags
}
}

Kode/tekst der er indsat kan f.eks være

<p>Hej med dig</p> Se min <?php echo "<a class=*
href="*">kontaktside</a>"; ?>.

Det jeg ikke kan finde ud af, eller sikkert fuldkommen glor mig blind på, er
: Hvordan kan jeg indsætte BÅDE ' og " i <?php ?>, så eval() kan fortolke
det, så jeg kan få f.eks en title med i <a>-tagget i min PHP-eval()
renderering??

f.eks
<p>Hej med dig</p> Se min <?php echo "<a class=* href=* TITLE='bla bla
bla bla'>kontaktside</a>"; ?>.

???

Håber nogen fatter spørgsmålet, dvs jeg har formuleret mig korrekt, og det
ikke er for gnidret eller tåbeligt.


David Konrad
 
Posts: 13
Joined: Thu Nov 13, 2008 2:45 pm

Re: Problem med eval()

Postby Martin Larsen on Fri Nov 14, 2008 1:35 am

Spørger du om hvordan du kan få PHP til at evaluere en tekststreng med
blandet html og php indhold?
Martin Larsen
 
Posts: 60
Joined: Thu Jul 19, 2007 4:14 pm

Re: Problem med eval()

Postby Martin Larsen on Fri Nov 14, 2008 1:59 am

Martin Larsen wrote:

> Spørger du om hvordan du kan få PHP til at evaluere en tekststreng med
> blandet html og php indhold?

Måske spørger du om hvordan man blander enkelte og dobbelt gåseøjne?

Her er det lettest at bruge konstruktionen med det mærkelige navn, heredoc:

$president = 'Obama';
$str = <<Manden sagde: "USA's kommende præsident hedder $president"
EOD;
echo $str;


Læg mærke til hvordan du både kan have de forskellige anførselstegn og
alligevel bruge variabelparsing.

Hvis du simpelthen har brug for at vide hvordan man evaluerer en
vilkårlig blandet tekststreng med PHP og ikke-PHP, så er det uendeligt
meget lettere end de fleste tror. Det er slet ikke nødvendigt med løkker
og udtræk af tags!

Man skal bare indsætte den strengen mellem "?>" og "skidtet. Fx

===================
function evalMixed($mixedcode) {
return eval( "?>$mixedcode}

$php = <<echo date("H:i:s");
?>

Hej med dig


Se min kontaktside'; ?>.
EOD;

evalMixed($php);
==================

Bemærk at der som regel indsættes
tags i teksten fra en
tekstarea, disse skal fjernes før du kan fortolke PHP'en.

Hilsen
Martin
Martin Larsen
 
Posts: 60
Joined: Thu Jul 19, 2007 4:14 pm

Re: Problem med eval()

Postby David Konrad on Fri Nov 14, 2008 11:51 pm

Martin Larsen wrote:
> Spørger du om hvordan du kan få PHP til at evaluere en tekststreng med
> blandet html og php indhold?

Nej, det gør jeg i forvejen - ingen problemer der


David Konrad
 
Posts: 13
Joined: Thu Nov 13, 2008 2:45 pm

Re: Problem med eval()

Postby David Konrad on Sat Nov 15, 2008 12:37 am

Martin Larsen wrote:

>> Spørger du om hvordan du kan få PHP til at evaluere en tekststreng
>> med blandet html og php indhold?
>
> Måske spørger du om hvordan man blander enkelte og dobbelt gåseøjne?

Præcis! Altså i eval() - kort sagt : Jeg har brug for at kunne echo'e både '
og " i et stykke kode, indlejret i HTML, der hentes fra en database, som
rendereres med eval()

har f.eks gemt følgende som indhold på en side (pseudoeksempel)

html bla bla bla bla bla bla html
html bla bla bla bla bla bla html
$baseHREF=generateHREF(); //blot illustrativt, generer url
$SQL='select link,name,title from database';
$result=mysql_query($SQL);
while ($row=mysql_fetch_array($result)){
echo "".$row[name]."";
}
?>
html bla bla bla bla bla bla html
html bla bla bla bla bla bla html

det kører fint, men hvis jeg vil have title med i -tag'et, indkapslet i '
(som href helst også burde være, helst ", for XHTML-validering)

echo "
TITLE='".$row[title]."'>".$row[name]."";

altså title (og href) indkapslet med ' , så får jeg

Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in
[path] : eval()'d code on line *

Jeg kan simpelthen ikke gøre det - &qout; \' \" mm duer ikke her. Der burde
være en function ala quote_str olign, så sinlgeqoute (eller double qoute)
blev genereret i udskrivningsøjeblikket.

> Her er det lettest at bruge konstruktionen med det mærkelige navn,
> heredoc:
> $president = 'Obama';
> $str = <<> Manden sagde: "USA's kommende præsident hedder $president"
> EOD;
> echo $str;

Det hjælper desværre ikke - har forsøgt, men kan ikke se hvordan jeg skulle
kunne bruge det til at løse det konkrete eksempel, og det virker naturligvis
ikke, ellers havde jeg jo brugt denne løsning.


David Konrad
 
Posts: 13
Joined: Thu Nov 13, 2008 2:45 pm

Re: Problem med eval()

Postby Martin Larsen on Sat Nov 15, 2008 7:20 am

David Konrad wrote:

> det kører fint, men hvis jeg vil have title med i -tag'et, indkapslet i '
> (som href helst også burde være, helst ", for XHTML-validering)
>
> echo "
> TITLE='".$row[title]."'>".$row[name]."";
>
> altså title (og href) indkapslet med ' , så får jeg
>
> Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in
> [path] : eval()'d code on line *


Det virker altså fint nok. Har lige prøvet.

Eksekverer du nu også koden som jeg foreslog? Altså ved at evaluere hele
molevitten på en engang, indskudt mellem "?>" og "
Her er dit eksempel, lavet en lille smule om så det virker uden DB'en.
Det er php-koden først (som evaluerer), og derefter "datafilen" som skal
evalueres:

evaltest.php:
============
$php = file_get_contents('phpstring.txt');
eval("?>$php?>

phpstring.txt:
==============
html bla bla bla bla bla bla html
html bla bla bla bla bla bla html
$baseHREF='http//example.com';
$row['link'] = "param=1";
$row['title'] = "my title";
echo "TITLE='".$row[title]."'>".$row[name]."";
echo "\n";
echo "$row[name]";
echo "\n";
?>
html bla bla bla bla bla bla html
html bla bla bla bla bla bla html


Måske bliver linjen brudt forkert og skaber syntaxfejl, men du kan hente
hele projektet her: http://kreacom.dk/files/evaltest.zip


Nogle bemærkninger:

1.
Linjen her kan gøre væsentligt enklere:

echo "TITLE='".$row[title]."'>".$row[name]."";

Nemlig:

echo "$row[name]";


2.
Du bør putte apostroffer omkring indexnavnene, altså $row['name'] i
stedet for bare $row[name]. Ellers får muligvis grimme "notices" frem på
skærmen. Det ved du måske allerede, jeg nævner det bare!

Ovenstående gælder dog ikke hvis det inden i en tekststreng, så må der
IKKE være apostroffer, følgender er altså ugyldigt: echo "$row['name']";

3.
Hvis datafilen kommer fra en database, er der måske indskudt slashes som
forstyrrer koden. Dem må du da fjerne først!

Hilsen
Martin
Martin Larsen
 
Posts: 60
Joined: Thu Jul 19, 2007 4:14 pm

Re: Problem med eval()

Postby David Konrad on Wed Nov 19, 2008 8:26 pm

Martin Larsen wrote:
> David Konrad wrote:
>
>> det kører fint, men hvis jeg vil have title med i -tag'et,
>> indkapslet i ' (som href helst også burde være, helst ", for
>> XHTML-validering) echo "
>> TITLE='".$row[title]."'>".$row[name]."";
>>
>> altså title (og href) indkapslet med ' , så får jeg
>>
>> Parse error: syntax error, unexpected T_STRING, expecting ',' or ';'
>> in [path] : eval()'d code on line *
>
>
> Det virker altså fint nok. Har lige prøvet.
>
> Eksekverer du nu også koden som jeg foreslog? Altså ved at evaluere
> hele molevitten på en engang, indskudt mellem "?>" og "
Undskyld det sene svar! Har meget om ørerne! Tak for hjælpen i øvrigt.

Heredoc er bare ikke en option ift problemet, og jeg er ikke helt sikker på
at problemet helt er forstået.

Det handler ganske enkelt om, at er indlejret i HTML, gemt i
en streng i en database, hvor eval() så kaldes. Løsningen er ikke de ting du
foreslår, men slet og ret at kalde en funktion inde fra eval()-koden, der
genererer de link med korrekte qoutes, som ikke er mulige fra eval()-koden,
der selv er qoutet (det er derfor problemet opstår) ala

function linkxxx($url,$text,$title='') {
echo "".$text."";
}

så fungerer det, og det er i øvrigt langt bedre ift efterfølgende rettelser
mv.

(...)
> 1.
> Linjen her kan gøre væsentligt enklere:
>
> echo "> TITLE='".$row[title]."'>".$row[name]."";
>
> Nemlig:
>
> echo "> TITLE='$row[title]'>$row[name]";

Ja, men jeg går pimært ind for læsbarhed og lettilgængelighed ift rettelser,
også om 7 måneder. "Enklere" er ikke nødvendigvis lig med hurtigere, mere
elegant eller mere læsbart. Ovenstående er sådan set "du kan skrive det med
færre tegn", helt unødvendigt i mine øjne. I øvrigt er det et helt
frivilligt, gratis projekt, så jeg er ikke under tidspres mv, og bruger det
lidt som eksperimentarium.

> 2.
> Du bør putte apostroffer omkring indexnavnene, altså $row['name'] i
> stedet for bare $row[name]. Ellers får muligvis grimme "notices" frem
> på skærmen. Det ved du måske allerede, jeg nævner det bare!

Det indikerer lidt, at du ikke helt har forstået problemet. Når jeg ikke kan
sætte singleqoutes om en streng, kan jeg jo heller ikke sætte singleqoutes
om en array-angivelse.

> Ovenstående gælder dog ikke hvis det inden i en tekststreng, så må der
> IKKE være apostroffer, følgender er altså ugyldigt: echo
> "$row['name']";
> 3.
> Hvis datafilen kommer fra en database, er der måske indskudt slashes
> som forstyrrer koden. Dem må du da fjerne først!

Jeg fjerner slashes og oversætter alle tegn til HTML-koder, &<>æøå²é mv, i
mit 35.000 liniers delphi-administrations program, undtagen naturligvis
blokke der er markeret som at de skal rendereres i PHP.

Tusind tak for dit svar, men det var no offense var ikke en "PHP -
grundlæggende modul, uge 1", jeg fiskede efter :-) Det var én af den slags
dumme situationer, hvor forskellige forudsætninger blandet sammen influerer
negativt på hinanden, en slags deadlock.

mvh
david


David Konrad
 
Posts: 13
Joined: Thu Nov 13, 2008 2:45 pm

Re: Problem med eval()

Postby David Konrad on Wed Nov 19, 2008 8:28 pm

David Konrad wrote:

> Det indikerer lidt, at du ikke helt har forstået problemet. Når jeg
> ikke kan sætte singleqoutes om en streng, kan jeg jo heller ikke
> sætte singleqoutes om en array-angivelse.

I øvrigt ligesom f.eks

echo "
";

ikke fungerede heller...


David Konrad
 
Posts: 13
Joined: Thu Nov 13, 2008 2:45 pm

Re: Problem med eval()

Postby Martin Larsen on Fri Nov 21, 2008 4:48 pm

Hej David

> Undskyld det sene svar! Har meget om ørerne! Tak for hjælpen i øvrigt.

Selv tak.

> Heredoc er bare ikke en option ift problemet, og jeg er ikke helt sikker på
> at problemet helt er forstået.

Jamen i det indlæg du svarer på er der jo slet ikke brugt heredoc!

Måske taler vi forbi hinanden, men det viste eksempel kan eksekvere den
kode du havde problemer med, ganske som du skrev den med diverse quotes
af den ene og den anden slags, og altså uden brug af heredoc :-)

Jeg refererer især til:

> det kører fint, men hvis jeg vil have title med i -tag'et, indkapslet i '
> (som href helst også burde være, helst ", for XHTML-validering)
>



> så får Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in
> [path] : eval()'d code on line *


Hvor det som vist i mit eksempel går helt fint i title-versionen også.

> Det indikerer lidt, at du ikke helt har forstået problemet. Når jeg ikke kan
> sætte singleqoutes om en streng, kan jeg jo heller ikke sætte singleqoutes
> om en array-angivelse.

Jeg har skam forstået problemet, men som vist i eksemplet går det ganske
fint med singlequotes om array-angivelsen.

> Tusind tak for dit svar, men det var no offense var ikke en "PHP -
> grundlæggende modul, uge 1", jeg fiskede efter :-)

Det regnede jeg såmænd heller ikke med. Ellers havde du nok slet ikke
spurgt om eval ;-)

Hilsen
Martin
Martin Larsen
 
Posts: 60
Joined: Thu Jul 19, 2007 4:14 pm

Re: Problem med eval()

Postby Martin Larsen on Fri Nov 21, 2008 5:24 pm

David Konrad wrote:

> Det handler ganske enkelt om, at er indlejret i HTML, gemt i
> en streng i en database, hvor eval() så kaldes. Løsningen er ikke de ting du
> foreslår, men slet og ret at kalde en funktion inde fra eval()-koden, der
> genererer de link med korrekte qoutes, som ikke er mulige fra eval()-koden,
> der selv er qoutet (det er derfor problemet opstår) ala

Drejer det sig om at den oprindelige html/php kode bliver quoted før
indsættelsen i databasen og ikke bliver unquoted tilbage til præcis
samme tilstand som før? (Så der derved kommer syntaxfejl når den evalueres)

I så fald kan jeg anbefale at base64-encode tekststrengen før
indsættelsen i DB og så base64-decode den ved evalueringen. Så bliver du
helt fri for at tænke på særlige tegn, mod at data fylder en smule mere.

http://de3.php.net/manual/en/function.base64-encode.php

Jeg havde et lignende problem med umulige blandinger af forskellige
quotes som jeg løste én gang for alle på den måde.

Hilsen
Martin
Martin Larsen
 
Posts: 60
Joined: Thu Jul 19, 2007 4:14 pm

Next

Return to Produktion af websider ved brug af php (dk.edb.internet.webdesign.serverside.php)

Who is online

Users browsing this forum: No registered users and 0 guests