Sziasztok
Környezet: PHP5 - Ubuntu 9.04
A cél az lenne, hogy két darab változóból rakjak össze egy if(...) feltételét, melyet vizsgálni szeretnék.
Én így (is) próbáltam, de semmire sem mentem vele:
$foo='2';
$baz='<3';
if ($foo{$baz})
{...}
De ahogy én nézem, csak azt nézi a fenti felépítéssel, hogy a $foo{$baz} egy értékkel rendelkező string, így az IF minden további nélkül lefut, mint igaz feltétel.
Én azt szeretném, hogy csak akkor fusson le, ha a változókból összerakott 2<3 feltétel igaz. A $foo és a $baz értéke futás közben változhat.
Valaki tudna rajtam lökni kicsit a helyes irányba?
Köszönöm
- 2106 megtekintés
Hozzászólások
Nem értek a PHP-hez, de a gugli az eval() függvényt ajánlotta, talán segít...
--
Nagyimami
- A hozzászóláshoz be kell jelentkezni
jaja, evallal kell, csak arra figyelj, hogy a $foo, es $baz ne az usertol jojjon, kulonben jo kis sechole-t csinalsz a progidba
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
Alapvetően én mindig azt szoktam tanácsolni, hogy ne akarj evalt használni. Soha. Nem. Nem azért, mert nem lehet jól használni hanem azért, mert elég egy ici pici dolgot elnézni és máris exec vulnos vagy. Inkább el kéne gondolkozni azon, hogy az alapvető kérdésen túl mi vitte a t. kérdezőt arra, hogy ilyet akarjon cselekedni, mert általában erre nem nagyon van szükség. Nagyon speciális esetekben (0.00001%) lehet, de induljunk ki abból, hogy ilyet ugyanúgy nem csinálunk, mint ahogy rendszer szinten nem csinálnánk ilyet.
A fenti példában ráadásul baromi egyszerű a dolog, mert bekérünk a felhasználótól 3 változót, nevezetesen az első számot, a műveleti jelet és a második számot, majd erre megírjuk a véges mennyiségű esetet egy függvénybe aminek az eredményét az ifben fölhasználjuk.
- A hozzászóláshoz be kell jelentkezni
Csatlakozom az előttem szólóhoz.
Eval a php-ben tesztelésre és saját scriptek írásához való.
Portálhoz használni az orosz rulett maga, ahol csak idő kérdése, hogy mikor jön a töltény.
Ha mégis eval kéne, és megoldható, akkor inkább helyezd ki kliensoldalra, ahol majd a JavaScript eval-ja elbíbelődik vele.
Ha olyan komoly oldalt akarsz, ahová egy kvázi parancsértelmező kell, akkor a JS indokolt és kéznél is van.
- A hozzászóláshoz be kell jelentkezni
ezen felül is javasolnám a kikerülését… pl. ha a feltétel mindig számossági reláció, akkor mindenképp inkább szétszedném, és csinálnék rá jó kis elágazást. Könnyen lehet még gyorsabb is, evalról sokan mondják, hogy olyankor újra meghívja a php-t (szerintem ez mondjuk hülyeség, csak nem…:))
—-—-—
int getRandomNumber() {
return 4;//szabályos kockadobással választva.
} //garantáltan véletlenszerű. xkcd
- A hozzászóláshoz be kell jelentkezni
Nem hívja meg.
A rekvirált fájlokhoz hasonlóan fordít majd futtat.
- A hozzászóláshoz be kell jelentkezni
Így végiggondolva az eval() nem járható nálam, mert eléggé lekorlátoztam mindenféle felhasználóval interakcióban levő/szóba jöhető függvényt és a fentebbi a biztonsági rés kockázata végett tiltott.
Más irányból esetleg járható még a feladat, vagy érdemesebb a program logikát újragondolni és más irányból megközelíteni a dolgot?
- A hozzászóláshoz be kell jelentkezni
Mindenképpen azt mondanám, hogy gondold újra, mert ehhez kéne írnod egy kifejezés-elemzőt, az pedig nem egyszerű feladat. Persze, ha szeretnéd, akkor a klienstől kapott kifejezésre csinálj elemzőt, majd preorder bejárással hajtogasd végre a műveleteket. Egyetemi iskolapéldának gyönyörű, azonban aligha lesz gyors és a céljaidnak megfelelő.
- A hozzászóláshoz be kell jelentkezni
nekem ennél a preg_replace_callback ugrott be.
regexppel elkapjuk a relációjel/akármi előtti részt, a jelet magát, meg ami utána jön.
callback függvény bekajálja, elágazik, visszadob 1-et vagy 0-t stringként (asszem muszáj neki azt visszaadnia, mégiscsak stringben replace-el by design).
Ha nincs ótvarsok variáció operátorra, és a két másik paraméterben tuti nincs benne egyik változata sem, működhet a dolog.
Persze az az ideális, ha 3 változóként kaphatjuk meg a dolgot, és akkor nem kell hülye stringeket parsolgatnunk.
—-—-—
int getRandomNumber() {
return 4;//szabályos kockadobással választva.
} //garantáltan véletlenszerű. xkcd
- A hozzászóláshoz be kell jelentkezni
Sajnos ez nem a megfelelő megoldás, mivel lehet műveleti precedencia és hasonló szépségek. Tekintve hogy ittntulajdonképpen nyelvi elemzőről van szó, egyszerűsített formájában úgy lehet megvalósítani, hogy balról jobbra végigszaladunk rajta és építünk belőle egy műveleti fát. Tehát ha egy összeadásról van szó, akkor a fa gyökere a plusz jel lenne, a két gyereke egy-egy szám. Ezt preorder bejárással kell végrehajtani, azaz a gyökét (plusz) jön előre, ez a művelet, a gyerekeket pedig külön-külön végrehajtjuk. Két számnál itt nincs mit végrehajtani, szóval jön a gyökér.
- A hozzászóláshoz be kell jelentkezni
Azt hiszem, igazad van.
Átgondoltam a feladatot és értelmesebb, sőt bővíthetőbb módot leltem a megoldásra. Abból meg már kinőttem, hogy a szépsége miatt írjak nyelvi elemzőt magamnak.
- A hozzászóláshoz be kell jelentkezni
Szia!
Ne haragudj, hogy ezt mondom, de elég gáz tervezésre utalhat egy ilyen programrészlet. Nem lenne jobb inkább áttervezni?
- A hozzászóláshoz be kell jelentkezni
De, neked is igazad van.
A felvetett probléma igazából csak lustaságból jött elő, a fő vonulat kész és működik. Inkább csak kíváncsiságból kérdeztem rá és amire számítottam, beigazolódott.
Mint fentebb írtam, megoldottam a dolgot jelentősen kulturáltabb módon.
- A hozzászóláshoz be kell jelentkezni