Portál AbcLinuxu, 12. května 2025 05:11

Dotaz: Divný select...

poky74 avatar 23.6.2009 17:09 poky74 | skóre: 36 | blog: Zápisník | Vrchlabí
Divný select...
Přečteno: 275×
Odpovědět | Admin
V phpku dělám celkem dlouho, ale teď už několik hodin (!!!) bádám nad tím, s čím potřebuju poradit...

Měl by to být script na výběr dat (článku) z db:
$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...
Chcete Linuxové samolepky nebo Tuxe na klíče? ->
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.6.2009 18:32 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Divný select...
Odpovědět | | Sbalit | Link | Blokovat | Admin

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()

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
poky74 avatar 24.6.2009 00:17 poky74 | skóre: 36 | blog: Zápisník | Vrchlabí
Rozbalit Rozbalit vše Re: Divný select...
Divné, píše to tohle:
['ahoj-ahoj ' = 'cau']
['cau ' = 'cau']
['' = 'cau']
['' = 'cau']
['' = 'cau']
['' = 'cau']
['' = 'cau']
['' = 'cau']
['' = 'cau']
['' = 'cau'].............. TO SAME PORAT DOKOLA
Jinak, pokud jsou nyni v db 2 zaznamy, mel by se cykl vykonat maximalne 2x, ne se zacyklit...
Chcete Linuxové samolepky nebo Tuxe na klíče? ->
24.6.2009 00:30 T
Rozbalit Rozbalit vše Re: Divný select...
Protoze v databazi jsou ulozeny "ahoj " a "cau " - s mezerou na konci, proto se cyklus nezastavi na podmince rovnosti tech retezcu. Kazdej dalsi select vybere prazdny radek, ale to neni osetreno v podmince cyklu. Takze se program zacykli.
24.6.2009 08:47 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Divný select...

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

 

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
poky74 avatar 24.6.2009 09:28 poky74 | skóre: 36 | blog: Zápisník | Vrchlabí
Rozbalit Rozbalit vše Re: Divný select...
Ejhle, mezery jsem si nevšiml :)

Teď už se s tím poperu, díky vám za pomoc, mezera me opravdu nenapadla :)
Chcete Linuxové samolepky nebo Tuxe na klíče? ->
24.6.2009 09:53 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Divný select...
Kdybys to porovnával v databázi, tak by mezera na konci nebyla problém, protože ji MySQL u nebinárních typů ignoruje (je to vysvětleno v manuálu).
23.6.2009 20:50 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: Divný select...
Odpovědět | | Sbalit | Link | Blokovat | Admin
Existuje nějaký rozumný důvod, proč nepoužít 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 :-)

Mimochodem, PHP má datový typ bool.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.