Portál AbcLinuxu, 12. května 2025 05:11
$cislo_clanku=1; $pokracovat=1; while ($pokracovat==1){ $clanekk=mysql_fetch_array(mysql_query('select * from clanky where id="'.$cislo_clanku.'"')); if($clanekk['adr']==$_GET['read']){echo "bingo";$pokracovat=0;} $cislo_clanku++; }Tedy je to cykl, který se bude provádět, dokud se mu neřekne dost (respektive nenastaví proměnná $pokracovat na 0). Na nulu se to nastaví v případě že $clanekk['adr']==$_GET['read'], v db jsou dva záznamy v kolonce "adr" a to "ahoj" a "cau". Bohžel ať je v proměnné $_GET['read'] "ahoj" nebo "cau" tak se zacyklí, proč? Díky PS. vím, že takhle se to nedělá, ale už jen z principu bych rád přišel na to, proč to nejede...
Fujtajbl :), žádné ošetření, procházení znovu a znovu novým selectem - to je docela fičák :)
ale ...
Dal bych před if toto
echo "['".$clanekk['adr']."' = '".$_GET['read']."']<br />";
a na konec
if($cislo_clanku > 1000) break;
a díval se co se vypíše - to je takový rychlý „debuger“ :)
ahoj a cau lze porovnávat pomocí = pokud to teda není jedno v UTF-16 a druhé v UTF-8, ale jinak bych doporučil strcmp()
['ahoj-ahoj ' = 'cau'] ['cau ' = 'cau'] ['' = 'cau'] ['' = 'cau'] ['' = 'cau'] ['' = 'cau'] ['' = 'cau'] ['' = 'cau'] ['' = 'cau'] ['' = 'cau'].............. TO SAME PORAT DOKOLAJinak, pokud jsou nyni v db 2 zaznamy, mel by se cykl vykonat maximalne 2x, ne se zacyklit...
No na tom je jasně vidět kam takový kód vede :)
Kdyby bylo ošetřeno mysql_query a mysql_query jasně by bylo vidět, že to (asi) na 3. smyčku vrací nulový počet řádků tudíž:
$clanekk === NULL
Pokud se jedná o PHP5 (i PHP4 s malou vyjímkou) tak pokud vložíš na začátku kódu
error_reporting(E_ALL | E_STRICT);//php4 (asi) error_reporting(E_ALL); ini_set('display_errors', 'On');
Jistě tam vyjedou nějaká zajímavá hlášení :)
Jinak 'cau' a 'cau ' není překvapivě totéž :)
DOPORUČUJI jednoznačně kód ošetřit tzn. minimálně:
if(!($rs = mysql_query('select * from clanky where id="'.$cislo_clanku.'"'))); { error } else if(!($clanekk=mysql_fetch_array($rs))) { /* pozor na mysqli_xxxx vrací NULL, mysql_xxx false */ error } else { pokracovat } }
Po důvodu braní záznamů po jednom nepátrám, jediné takovéto použití co mě napadá:
snad že řádek je moc veliký (např ø 1Mb) a je jich nekonečně mnoho a provádí se s řádkem nějaké operace a pak se zahodí.
V tom případě je to odůvodnitelné štření zdrojů na úkor výkonu.
Také nepátrám proč neporovnat v clausuli WHERE rovnou text :).
WHERE adr = ?
a dosadit tam správně ošetřenou (escaping nebo lépe prepared statement) hodnotu $_GET['read']
? Tenhle kód si přímo říká o DoS. I kdyby to někdo neudělal záměrně, stačí trochu větší návštěvnost a program si to zařídí sám. Takovými zdrojáky se straší malé servery, případně se objevují na The Daily WTF bool
.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.