/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Problem med eval()
Fra : David Konrad


Dato : 13-11-08 22:46

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=xxx
href="xxx">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=xxx href=xxx 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.



 
 
Martin Larsen (14-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 14-11-08 09:36

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

Martin Larsen (14-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 14-11-08 09:59

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 = <<<EOD
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 "<?" og så evaluere
skidtet. Fx

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

$php = <<<EOD
<?php
echo date("H:i:s");
?>
<p>Hej med dig</p>
Se min <?php echo '<a class="xxx" href="xxx">kontaktside</a>'; ?>.
EOD;

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

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

Hilsen
Martin

David Konrad (15-11-2008)
Kommentar
Fra : David Konrad


Dato : 15-11-08 08:37

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
<?php
$baseHREF=generateHREF(); //blot illustrativt, generer url
$SQL='select link,name,title from database';
$result=mysql_query($SQL);
while ($row=mysql_fetch_array($result)){
echo "<a href=".$baseHREF."?".$row[link].">".$row[name]."</a>";
}
?>
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 <a>-tag'et, indkapslet i '
(som href helst også burde være, helst ", for XHTML-validering)

echo "<a href='".$baseHREF."?".$row[link]."'
TITLE='".$row[title]."'>".$row[name]."</a>";

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 xx

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 = <<<EOD
> 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.



Martin Larsen (15-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 15-11-08 15:21

David Konrad wrote:

> det kører fint, men hvis jeg vil have title med i <a>-tag'et, indkapslet i '
> (som href helst også burde være, helst ", for XHTML-validering)
>    
> echo "<a href='".$baseHREF."?".$row[link]."'
> TITLE='".$row[title]."'>".$row[name]."</a>";
>
> 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 xx


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
$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
<?php
$baseHREF='http//example.com';
$row['link'] = "param=1";
$row['title'] = "my title";
echo "<a href='".$baseHREF."?".$row[link]."'
TITLE='".$row[title]."'>".$row[name]."</a>";
echo "\n";
echo "<a href='$baseHREF?$row[link]' TITLE='$row[title]'>$row[name]</a>";
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 "<a href='".$baseHREF."?".$row[link]."'
TITLE='".$row[title]."'>".$row[name]."</a>";

Nemlig:

echo "<a href='$baseHREF?$row[link]' TITLE='$row[title]'>$row[name]</a>";


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

David Konrad (20-11-2008)
Kommentar
Fra : David Konrad


Dato : 20-11-08 04:27

Martin Larsen wrote:
> David Konrad wrote:
>
>> det kører fint, men hvis jeg vil have title med i <a>-tag'et,
>> indkapslet i ' (som href helst også burde være, helst ", for
>> XHTML-validering) echo "<a href='".$baseHREF."?".$row[link]."'
>> TITLE='".$row[title]."'>".$row[name]."</a>";
>>
>> 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 xx
>
>
> 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 <?php kode ?> 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 "<a class=xxx href='".$href."' title='".$title."'>".$text."</a>";
}

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 "<a href='".$baseHREF."?".$row[link]."'
> TITLE='".$row[title]."'>".$row[name]."</a>";
>
> Nemlig:
>
> echo "<a href='$baseHREF?$row[link]'
> TITLE='$row[title]'>$row[name]</a>";

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 (20-11-2008)
Kommentar
Fra : David Konrad


Dato : 20-11-08 04:29

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 "<div style='margin-left:10px;'>";

ikke fungerede heller...



Martin Larsen (22-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 22-11-08 00:49

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 <a>-tag'et, indkapslet i '
> (som href helst også burde være, helst ", for XHTML-validering)
>

<cut>

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


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 (22-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 22-11-08 01:24

David Konrad wrote:

> Det handler ganske enkelt om, at <?php kode ?> 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

David Konrad (22-11-2008)
Kommentar
Fra : David Konrad


Dato : 22-11-08 10:22

Martin Larsen wrote:
> David Konrad wrote:
>
>> Det handler ganske enkelt om, at <?php kode ?> 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)

Ja! Lige netop!

Delphi-koden, hvis det overhovedet kan give mening - f.eks gem en statisk
side (sådan set blot en side)

procedure TFR_StaticPageText.btn_staticpage_saveClick(Sender: TObject);
var SQL: string;
T: string;
begin
T:=MM_HTML.Lines.Text;
T:=stringReplace(T,#39,'"',[rfReplaceAll]);

SQL:='update static_page_content set '+
'page_title='+encodeSQLText(ED_Title.text)+','+
'page_meta_description='+encodeSQLText(MM_Desc.Lines.Text)+','+
'page_meta_keywords='+encodeSQLText(MM_Keywords.Lines.Text)+','+
'page_breadcrumb='+encodeSQLText(ED_Bread.Text)+','+
'page_is_php='+inttostr(CB_Type.ItemIndex)+','+
'page_html='+encodePHPText(T)+' '+
'where page_id='+inttostr(FPageID)+' and
language_id='+inttostr(FLanguage);

D.OSCI.ExecSQL(SQL);

ED_Title.Modified:=false;
ED_Bread.Modified:=false;
MM_Keywords.Modified:=false;
MM_Desc.Modified:=false;
MM_HTML.Modified:=false;

updateButtons;
end;

simple "oversættelsesfunktioner"

function encodePHPText(text:string):string;
var count:integer;
begin
result:='';
for count:=1 to length(text) do begin
if text[count]='Æ' then result:=result+'&AElig;'
else if text[count]='æ' then result:=result+'&aelig;'
else if text[count]='Ø' then result:=result+'&Oslash;'
else if text[count]='ø' then result:=result+'&oslash;'
else if text[count]='Å' then result:=result+'&Aring;'
else if text[count]='å' then result:=result+'&aring;'
else if text[count]='²' then result:=result+'&sup2;'
else if text[count]='è' then result:=result+'&egrave;'
else if text[count]='é' then result:=result+'&eacute;'
else result:=result+text[count];
end;
result:=quotedstr(result);
end;

så når siden så hentes via MySQL i PHP, er den qoutet med ' - og det går
naturligvis galt

jeg håbede så, der var en qoutestr eller ækvialent i PHP - men det havde jo
alligevel været noget rod.

Nå, problemet er løst, og nu ved jeg hvordan jeg tackler den slags med eval
fremover.

> 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.

Det er faktisk ret smart, den mulighed kendte jeg ikke. Den skal jeg have i
baghovedet i fremtiden. Tak for det!

mvh



Martin Larsen (25-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 25-11-08 21:22

David Konrad wrote:
>
> Delphi-koden, hvis det overhovedet kan give mening

Jo da. Når jeg ikke lige koder i PHP, er det i Delphi. Optool
(http://www.kreacom.dk/optool) er et forholdsvis "berømt"
postcardware-program skrevet i Delphi med kol/mck så det derved kun
fylder ca. 100 k eller deromkring


> D.OSCI.ExecSQL(SQL);

Bare nysgerrig. Hvilke databasekomponent bruger du?

Hilsen
Martin

David Konrad (26-11-2008)
Kommentar
Fra : David Konrad


Dato : 26-11-08 14:27

Martin Larsen wrote:
> David Konrad wrote:
>>
>> Delphi-koden, hvis det overhovedet kan give mening
>
> Jo da. Når jeg ikke lige koder i PHP, er det i Delphi. Optool
> (http://www.kreacom.dk/optool) er et forholdsvis "berømt"
> postcardware-program skrevet i Delphi med kol/mck så det derved kun
> fylder ca. 100 k eller deromkring

Det kendte jeg ikke Har blot alle browsere "parat" nede i taskbaren.

Delphi er så dejligt, uanset hvad man kan finde på, kan man gribe fat i
Delphi og lave det i et snuptag. Jeg byggede websitet op sideløbende med et
Delphi-administrationsprogram, fordi det ganske enkelt er nemmere at smække
det sammen i Delphi, end det er at konstruere både webshop/hjemmeside-system
OG web-baseret administration på samme tid. Det *kan* godt være temmelig
tidskrævende at skulle vedligeholde et webbaseret system løbende, ift
ændringer i relationer og database-struktur, men jeg var nødt til have et
system - manuel administration er umulig med pt 103 indbyrdes forbundne
relationstabeller. Jeg er så begyndt i det små, med webbaseret
administration, f.eks ifb nyhedsbrev osv, men intet slår da
Delphi-programmet, hvor man kan styre mange sites på samme tid, i et
hierakisk træ, og endda køre på både lokal eller remote webhoteller direkte,
dvs på en live-webshop. Jeg synes selv det er et utroligt stærkt system.

Det er trist man ikke rigtig sådan professionelt kan få arbejde længere som
Delphi-udvikler.

>> D.OSCI.ExecSQL(SQL);
>
> Bare nysgerrig. Hvilke databasekomponent bruger du?

Forstår godt du spørger!! For det var virkelig en krævende proces, at få en
ordentlig, stabil MySQL-tilgang. Jeg begyndte selv at udvikle et
MySQL-databasekomponent, men det var rimelig problematisk, og selvom det
lykkedes til dels, var der for mange exceptions OG alverdens undtagelser ift
de forskellige MySQL-versioner - jeg havde ikke tid til det, og selvom det
jo var morsomt, skulle jeg blot bruge noget der fungerede. Jeg prøvede så en
masse forskellige "åbne" SQL-komponenter af, som jeg så wrappede til MySQL
og kørte dataset frem og tilbage mellem "native" datasets, og testede de
MySQL-komponenter der findes - brugte lang tid et komponent (husker ærlig
talt ikke hvilken, har været SAMTLIGE MySQL-komponenter igennem, med
statsgaranti, ingen virker særlig godt) som jeg fejlrettede og fik til at
fungere. Men, så kom der en update af zeoslib, som rent faktisk virkede, og
den har jeg brugt siden. http://sourceforge.net/projects/zeoslib

Der *er* fejl i det mv, det fungerer dog, og jeg kører database-laget
fuldkommen separeret fra den øvrige kode. Denne OSCI er en (meget stor)
wrapper-klasse der indeholder alt ift den aktuelle webshop-connection, f.eks
instantierer database-tabeller i klasser mm, som properties ala

property Languages: TLanguageList read FLanguageList;

f.eks de statiske sider, som jeg havde problemer med, ift evail()

property StaticPages: TStaticPages read FStaticPages write FStaticPages;

og denne enorme "container" bruges så i cirka 80 forme eller frames, der
udgør administrationen af websitet på et logisk, idiot-sikkert niveau.

Wrapperen er i øvrigt en konsekvens af, at jeg prøvede så mange
database-komponent løsninger af, samtidig med at jeg jo udviklede systemet,
og det har virkelig været helt i uheld, for med bagvedliggende
exceptionhandling, transaktionsstyring mv, er det totalt idiot-sikkert og
fungerer så godt som hvis jeg kørte på en local paradox eller oracle.

Nå, det var en lang smøre. Det er ikke hver dag, hvis nogen sinde, jeg får
lejlighed til at udbrede mig om Delphi-administrationsystemet

mvh



David Konrad (15-11-2008)
Kommentar
Fra : David Konrad


Dato : 15-11-08 07:52

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



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408186
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste