ugrás a tartalomhoz

eval() helyett???

viktorwrz · 2007. Aug. 1. (Sze), 18.19
Sziasztok!

Előre bocsájtanám, h nem vagyok programozó csak kicsit belemélyedtem a webszerkesztés izgalmas világába.
Nos a következő problémával fordulok hozzátok:
Weboldalamhoz Joomla portálrendszert használok és a weboldal költöztetése után nem működik megfelelően az egyik - úgy nevezett - komponens. A hiba feltárásakor arra jutottam, hogy a következő kódrészletnél van a hiba.

print "\t<tr class=\"$class\" ".$style." ".$onclick.">\n";
//print $lfields;
$str = null;
eval("\$str = \"$lfields\";");
echo $str. "\n";
print "\t</tr>\n";
Valószinüleg az eval parancsban lévő változó ($lfields) -aminek értéke szintén egy php-kód - nem fut le valamiért az új szerveren ezért nem ad eredményt sem. Ez okozza a rendellenes működést.
Tudnátok valami alternativát ajánlani az eval-ra? Mivel tudnám kihelyettesiteni vagy kideriteni, h miért nem fut le a parancs?
Esetleg, hogyan tudnám valahogy máshogy lefuttatni a parancsot, az eredményt pedig valami tömbben vagy miben eltárolni majd printtel vagy echoval kiirni? Legalábbis valahogy igy képzeltem el. Bár lehet ezzel most nagy hülyeséget mondtam.

Segítségeteket előre is nagyon köszönöm.
 
1

"\$str

saxus · 2007. Aug. 1. (Sze), 21.53
Szerintem azért nem működik, mert a $str előtt van egy \, amit nem tud értelmezni a PHP.

Egyébként a $str = $lfields; értékadás önmagában miért nem jó? Meg miért vegyíted össze-vissza a stringösszefűzéseket a behelyettesítésekkel?

így pl. miért nem jó?
printf("\t<tr class=\"%s\" %s %s>\n%s\n\t</tr>\n",
 $class, $style, $onclick, $lfields);
Vagy így:
echo "\t<tr class=\"".$class."\" ".$style." ".$onlcick.">\n".$lfields."\n\t</tr>\n";
Másrészt egy tipp: szerintem a sok \n és \t formázást hagyd el (úgy is csak a kimeneti méretet növelik) és inkább használj ' -t a stringek zárására, akkor megkímélheted magad a " jelek escapelésétől (az meg előfordul nem egyszer a HTML kódban) és szerintem átláthatóbb lesz az egész. Pl.:
echo '<tr class="'.$class.'" '.$style.' '.$onlcick.'>'.$lfields.'</tr>';
2

$str...

zzrek · 2007. Aug. 1. (Sze), 22.51
(Ha jól értelmezem, direkt van a $ előtt a \, hogy ne értelmezze, hanem stringként kezelje a $str-t a php, hogy aztán az eval beletehessen a $str változóba valamit, ami a $lfields-ben tárolt "php-kód" eredménye)
Vagyis:
Tegyuk fel, hogy $lfields='"aa"."bb"';

- ha a $lfields-t tényleg egy "php-kód"-ként akarjuk értelmeztetni, akkor eval("\$str = $lfields;");
- ha sztingként, akkor viszont az okozhat galibát, hogy " van benne, és akkor valami addslashes kell bele:
eval("\$str = \"".addslashes($lfields)."\";");

?
3

Minek eval?

janoszen · 2007. Aug. 2. (Cs), 05.37
Csak én vagyok hülye vagy a fenti eval tényleg csak ennyit csinál?
<?php
$str=(string)$lfields;
?>
4

én is így értelmezem

zila · 2007. Aug. 2. (Cs), 09.36
Ez a kód még egy ok, hogy kerüljem a Joomla-t...
10

te vagy :)

amonrpg · 2007. Aug. 3. (P), 09.29
a $lfields sztem tartalmazhat php kódot is. s ha van benne, a te megoldásoddal nem fut le. azért a joomla-t se hülyék írták... max. tervezni képtelenek. :)
5

kis félreértés

viktorwrz · 2007. Aug. 2. (Cs), 10.04
Nos, akkor tisztáznék néhány dolgot, mert kicsit rossz irányba halad a dolog:)
A kód csak 1 részlet, méghozzá egy speciális összetevőhöz tartozó keresőé.
TEHÁT NEM ÉN ÍRTAM!!!
A kódrészletben van egy kikommentezett print parancs. Ha ezt a kommentet eltávolítom akkor a honlapon megjelenik $lfields értéke ami egy PHP-KÓD sorozat.
Az említett kereső egyébként működik tökéletesen a régi szerveren!
Hogy értsétek miről van szó vázolom a működését.
Adott 1 közösségi portál - Joomlával hajtva - ennek része egy usermanagement "szoftver" (Community Builder hátha valaki ismeri) amiben alapból nincs összetett kereső ezért ez egy külön "szoftver". Ez az összetett kereső pedig az új szerveren valamiért a találatokhoz nem ír eredményt ($lfields).
A találatok számát kiírja, sőt a userekre mutató link is ott van (a forrásban) de mivel $lfields -től nem jön vissza eredmény (nicknév, avatarkép, város stb) ezért nincs mi belinkelődjön.

Tehát $lfields értékét mindenféleképp futtatni kell, h működjön a dolog. Az eddig felhozott példákban viszont csak kiíródik $lfields értéke...ami nagyon kevés a boldogsághoz.

Ha jó vettem ki akkor az eval lefuttatja az "$lfields-ben" található kódot majd a kapott eredményt átadja $str -nek amit echo-val kiíratunk.

A joomláról meg csak annyit, h igaz van vele szívás, ha komolyabb oldalt akarsz csinálni, de még mindig ez a legkönnyebben testreszabható CMS mellesleg elég jól optimalizálható google papának.:)
A fenti kódot meg nem joomla fejlesztő készítette...
6

var_dump()

gonoszcsiga · 2007. Aug. 2. (Cs), 13.06
szerintem se avval a koddal van a baj amit bemasoltal, hanem avval ami az $lfields-be van, tehat az eval ele irj egy ilyet, hogy:
var_dump($lfields);
es kopizd mar be a kimenetet.
7

kimenet

viktorwrz · 2007. Aug. 2. (Cs), 14.05
Na szóval. beillesztettem a kapott kódot és ezt adja vissza: string(603) ""
Plusz kiírta a php-kódot.
Viszont rájöttem még 1 apróságra, arra, hogy ez a kód egy periódusban van benne.
Hogy lássátok miről volna szó itt a link.
A keresőbe írj be valamit mondjuk a példa kedvéért "viktor", majd nyomj entert vagy klikk a nagyítóra.
Bennehagytam a "var_dump($lfields);" sort...
8

periódus?

zila · 2007. Aug. 2. (Cs), 14.16
ciklusra gondoltál? ha igen, az a probléma szempontjábol most mellékes... legalábbis szerintem.
egész véletlenül nem register_globals on volt a régi helyen az újon meg off (ahogy az kell)?
Elképzelhető, hogy ez a modul vagy komponens erre számít és emiatt hiányzos a stringje?
9

register_globals

viktorwrz · 2007. Aug. 2. (Cs), 15.37
Igen ciklusra gondoltam. Ráadásul minden ciklusban más az értéke.
Megnéztem, de a register_globals mindkét szerveren OFF-ra van állitva.
Viszont most, hogy böngészgettem megláttam, hogy a míg a régi szerveren a MySql és a PHP is 4.xx verzió, addig az újon 5.xx ,gondolom ez (is) lehet a baja?
Letudnátok irni, hogy hogyan tudnam leellenőrizni, hogy $lfields értékében hol a hiba?
Ez a STRING (603)"" mit jelent?
Kezdek nagyon elkeseredni...
11

tényleg nincs megoldás???

viktorwrz · 2007. Aug. 6. (H), 17.37
Sziasztok!

Tényleg nem lehet kideríteni, hogy hol a hiba?
12

debug

zila · 2007. Aug. 6. (H), 18.40
Azt kell kiderítened, hogy a $lfields hogyan áll össze. Egy debuggerrel 1 óra alatt meglelheted...
(nehogy megkérdezd milyen debuggerrel, google :)
13

Köszönöm

viktorwrz · 2007. Aug. 7. (K), 18.04
Nagyon köszönöm a válaszodat. Még sosem hallottam létezik ilyen debugger, de így most már menni fog a hibakeresés....