Autor Zpráva
jefitto44
Profil
Robím jeden filter pre eshop. Mechanizmus je kus zložitý, ale v podstate ide o to, že človek si môže vybrať z 5 rôznych kritérií. Ja by som potreboval vedieť, ako upraviť MySQL Query, aby mi pri určitých prípadoch vyberalo všetko?
Funguje to asi takto: Užívateľ vyberie veci vo formulari, klikne filtruj, čim sa odošle formular, všetky posty sa prepíšu do session. A v query, ktorý vyberá dané produkty potom kontrolujem hodnoty premenných, či existujú a ak existujú, tak sa do query vo WHERE dopíše AND daco=$_SESSION["daco"]. Problém nastáva, ak nie je vybrané niektoré kritérium. Vtedy by som potreboval dopísať AND dacoine=VŠETKO. Vie mi niekto poradiť ako to dopísať?

Proste takto vyzerá časť pôvodného query
WHERE'. 
                                (($this->get_catalogue_menu_id() != NULL) ? ' pm.menu_id IN ("'.implode('", "', $this->get_catalogue_menu_id()).'")' : ' 1').'    
                               AND
                                   deleted = "'.$this->get_product_deleted().'"
                               AND
                                   available = "'.$this->get_product_available().'"
                                   '.((empty($_SESSION["type"]))? "":"AND type in(".implode(',', $_SESSION["type"]).")").'
                                   '.((empty($_SESSION["gadget"]))? "":"AND gadget in(".implode(',', $_SESSION["gadget"]).")").'
                                   '.((empty($_SESSION["sheath"]))? "":"AND sheath in(".implode(',', $_SESSION["sheath"]).")").'
                                   '.((empty($_SESSION["diameter"]))? "":"AND diameter BETWEEN ".$_SESSION["diamin"]." AND ".$_SESSION["diamax"]."").'
                                   '.((empty($_SESSION["resistant"]))? "":"AND resistant = '1'").'
                                   '.((empty($_SESSION["manuf"]))? "":"AND manufacturer_id=".$_SESSION["manuf"]."").'
                                   

A ja potrebujem, že ak by bolo nejaké session prázdne, aby vpísalo napr. AND resistant = $niečo, pričom to $niečo znamená, že sa vyberú resistant = 0 aj resistant = 1. To je ale príklad pre boolen. V skutočnosti tam bude viacero kritérií. A vypísovať to tam musím, lebo to idem zmeniť, aby to bralo podľa adresy URL
juriad
Profil
jefitto44:
Proč tam potřebuješ něco doplňovat? Když kritérium neuvedeš, tak se jím nebude filtrovat a žádné omezení na hodnoty nebude, jinými slovy vybere se vše.

Nechceš naopak při neexistenci nějakéjho kriteria jiné úplně zrušit, aby se nevygenerovalo?
jefitto44
Profil
Tak teda...
adresa pri filtri bude vyzerať takto
www.stranka.sk/sk/vsetky-produkty/vyrobca-quartz/material-zlato,titan/vodotesnost-30bar

A ja túto adresu použijem, expodujem ju na pole podľa lomítka a potom pri query, ktorý vyberá dané produkty používam tieto hodnoty
((!empty($rozdelenaAdresa[3]->hodnota))? "AND manufacturer=$premenna":"")
Ak by som úpne vynechal toho výrobcu, tak $rozdelenaAdresa[3] by už značila materiál, ale ja by som hľadal materiál podľa kritérií výrobcu, čo by bola samozrejme blbosť.
Preto ak užívateľ vo filtri nevyberie výrobcu, bude tam vsetky-produkty/vyrobca-/material-zlato,titan/... Detekujem, že vyrobcovi nie je pridelene nič a pridam do query AND manufacturer=VSETKO a toto kľúčove slovo VSETKO potrbeujem niečim nahradiť... akoby som tam dával AND manufacturer=quartz, AND manufacturer=Festina, AND manufacturer=Casio len nemôžem to tam takto vypísať ručne, lebo tých značiek tam bude dvesto... čiže potrebujem tam nejaké magické slovo, nech to vyberie všetko. Dá sa to?
Kajman
Profil
Místo AND manufacturer='quartz' nedáte prostě podmínku žádnou.
juriad
Profil
jefitto44:
Prostě tam tu klauzuli nedáš.

Jen tak mimo:
Pamatuj na to, že při povolení více výrobců nechceš používat AND. Pochybuji, že existují hodninky, které vyrábí quartz A ZÁROVEŇ Festina A ZÁROVEŇ Casio. Hodinky jsou vždy vyrobeny jedním výrobcem, ale ten může být jedním z vyjmenovaných - tedy OR a pozor na prioritu - závorkovat; nebo můžeš použít klauzuli IN
jefitto44
Profil
Dobre, ešte raz, lebo ste to nie dobre pochopili... adresa URL vyzerá takto
stranka.sk/hodinky/quartz,festina,tissot/zlato,hlinik,plast/
stranka.sk/hodinky/vyrobca1,vyrobca2,vyrobca3/material1,material2,material3/

ja robím implode z adresy podľa lomítka
$adresa=implode("/",$_SERVER["nejaky server name, itself, alebo čo"]);
$adresa[0]/$adresa[1]/$adresa[2]/$adresa[3] //[2]=vyrobca, [3]=material

čiže si rozimplodujem adresu do poľa a potom používam

(($adresa[2]=="quartz")? "AND manufacturer_name=quartz":"")

A teraz ak by som úplne vynechal výrobcu, čo by sa stalo? Za $adresa[2] by sa nepoužíval výrobca, ale materiály. PRoste by to hľadalo výrobcu názvom materiálu a to by nikdy nič nenašlo...
Ak to nechám prádzne, budem tam mať zas dva lomitka navyše... Preto tam potrebujem dať že nech vypíše iba deného výrobcu, alebo všetko

Áno, aj tých výrobcov potom budem znova implodovať
mimochodec
Profil
jefitto44:
Jestli nemáš v adrese "quartz", ale "vyrobca-quartz", neměl by snad být problém rozpoznat, která část adresy chybí a pak se podle toho při skládání toho SQL zařídit.

edit: aha, v #3 jsi to psal jinak, než teď v #6. Pokud tam "vyrobca" není, bylo by asi nejjednodušší dát tam místo něj třeba nulu: stranka.sk/hodinky/0/zlato,hlinik,plast
A pak si to v php ošetřit, resp. v případě nuly tu danou část AND úplně vyhodit.
juriad
Profil
Nebo místo 0 tam vrazit string "vsichni-vyrobci".
jefitto44
Profil
Áno došlo k zmene, bude tampriamo iba značka výrobcu bez popisu "vyrobca-"
Parada

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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