Cau,
mam formular s vice vystupnimi hodnotami, kdyby byli vsechny vyplneny tak jednoduse napisu:
mysql_query("SELECT * FROM tab WHERE podm1 AND podm2...AND podm6")
No jenze problem je v tom, ze ani jeden obejkt formulare neni poviny, takze kdyz min. jeden neni zadan, tak mi to nic nenajde.
Jak na to?
jestliže tam máš "podm1 and podm2" tak musíš splňovat OBĚ podmínky, jesti chceš splňovat pouze jednu z nich dej místo "and" "or"
Musíš správně vytvořit SQL dotaz i v případě, že nemáš vyplněny všechny položky. Když vyplníš jen první 2, dotaz musí znít:
SELECT * FROM tab WHERE podm1 AND podm2
Když nevyplníš žádnou:
SELECT * FROM tab
zkousel jsem to takto:
$podm="WHERE typ_prace LIKE ".$prace;
if($kraj){ $podm=$podm." AND lokalita_prace_kraj LIKE ".$kraj; }
if($mesto){ $podm=$podm." AND lokalita_prace_mesto LIKE".$mesto; }
if($obor){ $podm=$podm." AND obor LIKE ".$obor; }
$query="SELECT * FROM `npw_nabidka_prace` ".$podm." ORDER BY id DESC";
$nacteni=mysql_query('$query');
+ruzny finty s apostrofama, ale neslo to
Takze pro kazdou kombinaci podminek musim zvlast napsat SQL prikaz?
Jinak dik za radu zbi, Ondro tobe dekuji za snahu, ale tohle presne jsem nechtel :)
tak se mi to podarilo takto:
$podm="WHERE typ_prace='".$prace."' ";
if($kraj){ $podm=$podm." AND lokalita_prace_kraj = '".$kraj."' "; }
if($mesto){ $podm=$podm." AND lokalita_prace_mesto = '".$mesto."' "; }
if($obor){ $podm=$podm." AND obor = '".$obor."' "; }
$query="SELECT * FROM npw_nabidka_prace ".$podm." ORDER BY id DESC";
$nacteni=mysql_query($query);
kdyby to nekoho zajimalo :)
P.S. '" = ' a " nebo " a '
"Takze pro kazdou kombinaci podminek musim zvlast napsat SQL prikaz."
ANO, pro každou kombinaci musíš vytvořit jiný SQL příkaz. ALE jde to optimalizovat:
Tyto proměnné získáš z formuláře: $kraj, $mesto, $obor
if (empty($kraj)) $kraj="%";
if (empty($mesto)) $mesto="%";
if (empty($obor)) $obor="%";
$query="SELECT * FROM `npw_nabidka_prace` WHERE lokalita_prace_kraj LIKE $kraj AND lokalita_prace_mesto LIKE $mesto AND $obor LIKE $obor";
NEZKOUŠENO.
Drobná opava:
$query="SELECT * FROM `npw_nabidka_prace` WHERE lokalita_prace_kraj LIKE $kraj AND lokalita_prace_mesto LIKE $mesto AND obor LIKE $obor";
dik uz mi to funguje, mam to napsany tak jak jsem to psal vyse
varianta bez pouziti procent je lepe optimalizovana, protoze varianta s procenty pokazde zbytecne testuje vsechny ty sloupce na %, coz zabere rozhodne vic casu (u velke tabulky) nez to vyclenit rovnou v PHP.
Zdravím,
chtěl bych se zeptat, jestli při odesílání dat z formuláře přes metodu GET a při tomto způsobu setavení dotazu do databáze nutné ověřovat vstupní data, aby někdo nemohl do dotazu podstrčit nesprávné hodnoty a "zaútočit" tak nějakým způsobem na databázi, nebo jestli to není nutné, protože prostě nebude jen splněna podmínka a nic to nevyhledá?
Jirka (jirky.webz.cz)
novy dotaz, nove tema, nepis do ciziho.
Overovani platnosti udaju je tva zalezitost, na tvem uvazeni. Bez muze akorat podstrcit prihlaseni, zobrazit si tabulku se jmeny a hesly, prepsat nejake soubory. Nic tak vazne :)
$x = $_GET['x'] == 1
if ($x==1) {}
$x = $_GET['x'] == 'echo $heslo'
if ($x==(echo $heslo)) {...}
To neni tak vazne, proc by se meli udaje overovat, co myslis?
$x = $_GET['x'] == 'deletefile(\'index.php\')'
if ($x==(deletefile(\'index.php\')) {...}
if ($x==(print_r(mysql(zobraz tabulky))) {...}
if ($x==(mysql("DROP table")) {...}
Dík za odpověď.
Beru si to k srdci a provedu ověření vstupních dat.
---------------------
Ptal jsem se proto (a v tomto topicu), že chci udělat vyhledávání v tabulce podle více podmínek, jak je řešeno zde. Nic se tam nebude nikam zapisovat, žádná hesla, nic takového, jen se z ní budou číst řádky podle podmínek z formuláře -> tedy ....select * from ... where něco1 and něco2 and něco3 order by .... . Budu předávat jen to "něco1", "něco2" a "něco3", ale všechny nemusí být zadány najednou.
A měl jsem za to, že ikdyž někdo něco podstrčí do parametrů, tak prostě jen nebude splněna podmínka WHERE, a nic to v databázi nevyhledá.
peta: jak chceš SQL dotazem přepsat soubor?
Jirka: http://php.vrana.cz/obrana-proti-sql-injection.php
Tom (manual.wz.cz)
Kdo tu tvrdil, ze SQL dotazem? Viz priklad, obsahem promenne v GET. Ikdyz jsem to zrovna nejlepe asi nenapsal, zrovna tak to bude jako string. Ale spousta lidi pouziva echo strasne casto.
Jirka (jirky.webz.cz)
To asi jo, sory za zmateni. Jen je treba pocitat s evalovanim retezce (prevedenim na zdrojovy kod a jeho spusteni) pri echo nebo nejakych dalsich situacich. Zrovna u primeho porovnani s DB by nemelo nic nastat, jak pise Tom
Tom: Dík, přečetl jsem si ten článek.
Jen pořád nevím, jestli bych to nemohl udělat úplně jednoduše. Proměnné předávám pouze jako čísla, jeden jako 1-7 , druhé 1986 - 2006...
Jestli by mi nestačilo jen ověřit , že proměnná musí být pouze číslo a zárověň jen v určitém rozsahu. Při jiných číslech (ale i písmenech) v proměnné je podmínka z SQL dotazu zcela vynechána.
To by mi pak v podstatě nemohli nic podstrčit, resp. by to mělo podstrčené proměnné ignorovat.
Jirka: Správně, nevěřit nikomu a ničemu. To je základ bezpečnosti ;)
Určitě by to taky šlo. Pokud budeš kontrolovat jestli je proměnná číslo ( is_numeric() ) a ještě ke všemu jestli je v určitém rozmezí ( if($value)<X && if($value) > Y ) tak to bude dostatečné.
"Při jiných číslech (ale i písmenech) v proměnné je podmínka z SQL dotazu zcela vynechána." vůbec, pokud se ti v tom někdo vrtá, tak je potřeba dát mu vědět, že se to nedělá. Pokud u mě dojde k porušení některých podmínek u "pevně daných" proměnných tak prostě skript zakončím chybou a vůbec se potencionálním útočníkem nemazlím. Prostě: if(!podminka) exit('Neplatné vstupní hodnoty!');
peta: tak to promiň, já to pochopil tak, že se dá SQL dotazem upravit soubor.