Autor | Zpráva | ||
---|---|---|---|
rew Profil |
#1 · Zasláno: 23. 1. 2015, 21:18:01
Zdravím,
řeším již asi dva dny problém, jak vytvořit dotaz do tabulky. V jedné části webu mám rolovací menu (řešeno v HTML select, option), kde se jako hodnoty načítají z jiné tabulky školní roky (např. 2014/2015, 2013/2014,...). Rolovací menu začíná "Všechny školní roky" a pokračuje těmi roky. Tlačítkem odeslat se z tabulky vybrou záznamy, které obsahují konkrétní školní roky. Tyto školní roky jsou v tabulce zapsány jako ID čísla záznamu v tabulce školní roky. Když v rolovacím menu vyberu např. školní rok 2013/2014, tak podle toho, co jsem si vytvořil níže mi to funguje, vypíše řádky z tabulky, kde se tento záznam nachází. Řeším problém, když chci vybrat všechny školní roky, jak to potom mám udělat?? Ze SESSION dostanu ID číslo školního roku 2013/2014 např. 17 a to mám i v tabulce a záznam dle tohoto najdu. Ale když chci vypsat záznamy, kde jsou všechny školní roky....... tedy v tabulce jsou uloženy ID roků (17, 16, 5, 8, ,13, 6, 1, 1, 8, 9, ....) Díky $dotaz = 'SELECT * FROM prace WHERE sk_ID='.$_SESSION['skolni_rok'].''; $vysledek = mysql_query($dotaz, $db) or die(mysql_error($db)); |
||
mimochodec Profil |
#2 · Zasláno: 23. 1. 2015, 21:39:38
Položce "Všechny školní roky" nastav hodnotu třeba 0. Potom v php:
if ($_SESSION['skolni_rok']==0) { $dotaz = 'SELECT * FROM prace']; } else { $dotaz = 'SELECT * FROM prace WHERE sk_ID='.$_SESSION['skolni_rok']; } |
||
juriad Profil |
#3 · Zasláno: 23. 1. 2015, 21:45:28
mimochodec:
Lepší než vymýšlet speciální hodnotu, je lepší použít NULL, který má přímo význam žádné hodnoty. |
||
mimochodec Profil |
#4 · Zasláno: 23. 1. 2015, 21:58:35
juriad:
Nerozumím, jaké řešení naznačuješ. |
||
juriad Profil |
#5 · Zasláno: 23. 1. 2015, 22:01:29
mimochodec:
Jen použít místo hodnoty třeba 0 použít NULL. Jinak se to neliší. |
||
mimochodec Profil |
#6 · Zasláno: 23. 1. 2015, 22:02:56
juriad:
Aha, myslel jsem, že bys chtěl vynechat ten if, NULL posunout až do toho dotazu a nedávalo mi to smysl. Ok. |
||
rew Profil |
mimochodec:
Nad timto jsem taky přemýšlel, ale je to vhodný, pokud budu filtrovat jen jednu položku. Později budu dodělávat ještě obor, kterých bude asi 12 a pak ještě jedno rolovací menu, tedy celkem těch rolovacích polí bude 3. A kombinace 3 různých polí pomocí IF by bylo pak velice zdlouhavé. Myslel jsem, že by mohlo existovat nějaké jiné řešení. Pak by to vypadalo asi nějak takto: $dotaz = 'SELECT * FROM prace WHERE oboru_id='.$_SESSION['obor'].' AND sk_ID='.$_SESSION['skolni_rok'].' AND vybrano="'.$_SESSION['vybrano'].'"'; Když se pak vybere například, že se mají najít všechny obory, ale jen ve školním roce 203/2014 apod,... |
||
mimochodec Profil |
#8 · Zasláno: 23. 1. 2015, 22:39:36
rew:
Už jsem to určitě nejmíň jednou psal, ale teď to nemůžu najít. Začneš: $q = ""; Pak pro každou z podmínek uděláš: if ($_SESSION['obor']) {$q .= " AND obor=".$_SESSION['obor'];} A nakonec ověříš, jestli $q = "". Pokud ano, $dotaz = 'SELECT * FROM prace' . Pokud ne, $dotaz = 'SELECT * FROM prace WHERE 1=1 '.$q . Možná to popisuju nepřehledně, ale to určitě dáš.
|
||
rew Profil |
#9 · Zasláno: 23. 1. 2015, 22:44:58
mimochodec:
Teď jsi mě vnuknul se zamyslet nad Ternárním operátorem, to by taky mohlo jít. Zkusím to nějak poladit a napíšu jak jsem dopadl. |
||
mimochodec Profil |
#10 · Zasláno: 23. 1. 2015, 22:48:27
rew:
Teď si ještě říkám, že tu svou poslední větu bych upravil. Tu podmínku můžeš vynechat, prostě použij $dotaz = 'SELECT * FROM prace WHERE 1=1 '.$q .
|
||
rew Profil |
#11 · Zasláno: 23. 1. 2015, 22:50:10
mimochodec:
Díky beru na vědomí. |
||
Alphard Profil |
Jo, známý trik, dáme
1=1 aby tam bylo aspoň něco a můžeme dotaz patlat dál. :-) Vadou na kráse je, že to nemáte escapované.
Napsáno v dibi fluent rozhraní by to vypadalo asi takhle. $praceQuery = $db->select('*')->from('prace'); if ($_SESSION['skolni_rok']) $praceQuery->where('sk_id = %i', $_SESSION['skolni_rok']); // * if ($_SESSION['obor']) $praceQuery->where('obor = %i', $_SESSION['obor']); // ... $prace = $praceQuery->fetchAll(); // ** ** Pokud byla v dotazu chyba, vyhodí se výjimka, žádná další ošklivá or die .
Posuďte sami, co je lepší. |
||
rew Profil |
mimochodec:
Vyřešeno díky tvojí pomoci. Výsledek upraven pro 3 rolovací výběrová menu. První mi dává čistý text ANO nebo NE, tak jsem dal na začátek a ty zbylé za to a krásně to funguje. $q = ""; $r = ""; if ($_SESSION['obor'] != "vsechny_obory") {$q .= " AND oboru_id=".$_SESSION['obor'];} if ($_SESSION['skolni_rok'] != "vsechny_skolni_roky") {$r .= " AND sk_ID=".$_SESSION['skolni_rok'];} $dotaz = 'SELECT * FROM prace WHERE vybrano="'.$_SESSION['zvoleno'].'"'.$q.$r; $vysledek = mysql_query($dotaz, $db) or die(mysql_error($db)); Alphard: Také ti děkuji za cenné rady!!! 1=1 jsem třeba netušil že lze použít. Tomu tvému zápisu skoro vůbec nerozumím, nejsem takový profík... ale cením si odpovědi, podívám se na to. |
||
mimochodec Profil |
#14 · Zasláno: 24. 1. 2015, 00:11:31
rew:
Jen jedna drobná poznámka. Ta proměnná $r je zbytečná. Když místo ní na ř. 5 použíješ $q a všechny ostatní výskyty zrušíš úplně, bude to fungovat taky. Prostě budou všechny ty přilepované kousky v jedné proměnné $q . Ale to tvoje funguje samozřejmě taky, poradil sis s tím po svém.
|
||
rew Profil |
#15 · Zasláno: 24. 1. 2015, 09:51:20
mimochodec:
JJ pravda, upravil jsem a jde to i s jednou proměnnou. Popsal jsi to pro mě perfektně. Díky moc. |
||
Časová prodleva: 9 let
|
0