Autor Zpráva
rew
Profil
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
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
mimochodec:
Lepší než vymýšlet speciální hodnotu, je lepší použít NULL, který má přímo význam žádné hodnoty.
mimochodec
Profil
juriad:
Nerozumím, jaké řešení naznačuješ.
juriad
Profil
mimochodec:
Jen použít místo hodnoty třeba 0 použít NULL. Jinak se to neliší.
mimochodec
Profil
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
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
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
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
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(); // **
* Tímto zápisem se vstupy automaticky escapují.
** 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
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
mimochodec:

JJ pravda, upravil jsem a jde to i s jednou proměnnou.
Popsal jsi to pro mě perfektně. Díky moc.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: