| Autor | Zpráva | ||
|---|---|---|---|
| jefitto44 Profil |
#1 · Zasláno: 17. 10. 2014, 10:48:33
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 |
#3 · Zasláno: 17. 10. 2014, 11:24:02
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 |
#4 · Zasláno: 17. 10. 2014, 11:33:33
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 |
#6 · Zasláno: 17. 10. 2014, 12:55:34
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 |
#8 · Zasláno: 17. 10. 2014, 13:25:57
Nebo místo 0 tam vrazit string "vsichni-vyrobci".
|
||
| jefitto44 Profil |
#9 · Zasláno: 17. 10. 2014, 13:57:50
Áno došlo k zmene, bude tampriamo iba značka výrobcu bez popisu "vyrobca-"
Parada |
||
|
Časová prodleva: 12 let
|
|||
0