Autor | Zpráva | ||
---|---|---|---|
nowis Profil * |
#1 · Zasláno: 13. 12. 2011, 15:21:09
Zdravím,
jedná se asi o banalitu. Mám formulář o 12 polích. Na základě toho, které údaje uživatel zadá, se provede filtr. Potřeboval bych, aby se mi vygeneroval textový řetězec typu"WHERE A,B,C", který bych pak vložil do dotazu. Nevím, jak to provést elegantně. Napadlo mě řešení s mnoha if, ale nelíbí se mi. Mohli byste mě prosím navést? Děkuji |
||
Tori Profil |
#2 · Zasláno: 13. 12. 2011, 18:48:35
Udělala bych to asi takhle:
formulář: A = <input type='text' name='filtry[A]'>, B = <input type='text' name='filtry[B]'> C = ...
Na serveru máte mapu filtrů a db.sloupečků: $mapa = array('A' => '`sloupec1`', 'B' => '`sloupec2`'); a procházíte pole $_POST['filtry'] . Pokud je položka neprázdná, vezmete její klíč, přeložíte si ho na jméno odpovídajícího sloupce a doplníte do SQL i se zadanou hodnotou.
Jednodušším by se zdálo pojmenovat inputy podle sloupečků v DB, ale jednak tam je větší bezpečnostní riziko, druhak je to málo flexibilní, pokud by ve WHERE mělo být cokoli jiného než sloupec = hodnota. Jediný problém je, že nevíte, jakého typu je zadávaná hodnota, a teda čím ji správně escapovat. To by mohlo vyřešit buď mapa formulářové políčko => dat.typ, nebo odhadovat podle hodnot (mám pocit, že dibi tohle umí). |
||
nowis Profil * |
#3 · Zasláno: 14. 12. 2011, 08:48:12
Tori:
uauu, no zkusím to nějak pojmout :-) Díky |
||
nowis Profil * |
#4 · Zasláno: 14. 12. 2011, 10:38:25
ještě mně napadlo, nešlo by to udělat takhle? Nemůžu to teď vyzkoušet, ale nezdá se mi to jako nesmysl, ale jsem začátečník...
if (ISSET($_POST['A']) || ISSET($_POST['B']) || ISSET($_POST['C'])) {$pole = Array(('$_POST['A']), ISSET($_POST['B']), ISSET($_POST['C'])); Implode ($pole, ', '); $where = 'WHERE '.$pole; } a pak tu proměnnou $where vložím do dotazu... |
||
nowis Profil * |
#5 · Zasláno: 14. 12. 2011, 12:29:13
Tak jsem to vyzkoušel, a myslím, že by to mohlo fungovat, jen asi neumím použít pole, protože výsledek je "WHERE Vysledek1, 1, 1"
|
||
nowis Profil * |
#6 · Zasláno: 14. 12. 2011, 14:29:52
hmm, nefunguje :-(
if ($_POST['zadano']=='Filtrovat') { if ($_POST['A'] <> '' || $_POST['B'] <> '' || $_POST['C'] <> '') { $pole = Array( 'A" = "'.$_POST['A'], 'B" = "'.$_POST['B'], 'C" = "'.$_POST['C']); $where= 'WHERE "'.Implode ($pole, '", "').'"'; echo $where; } } Vím proč to tak je (implode), ale nevím jak z toho ven... |
||
Tori Profil |
#7 · Zasláno: 14. 12. 2011, 15:24:58
nowis:
Potřebujete každou hodnotu testovat, jestli byla zadaná a SQL si skládat postupně. Abyste nemusel použít x podmínek, je lepší to dělat v nějakém cyklu. A abyste nebyl vázaný na přesný počet / jména formulářových polí, pojmenovala bych je jako ve [#2] - pak stačí foreach($_POST['filtry'] as $nazev=>$hodnota) {...}
Klidně si to pro začátek zjednodušte a pojmenujte form.pole podle sloupečků v DB. Až to bude fungovat, tak třeba použijete i tu mapu. |
||
nowis Profil * |
#8 · Zasláno: 15. 12. 2011, 09:17:11
Tori:
jj, děkuju, jěště se s tím poperu, akorát - nikde jsem nikde nenašel co to znamená "mapa filtrů", mohla byste mi to prosím nějak ujasnit, nebo napsat kde hledat? Díky moc |
||
nowis Profil * |
#9 · Zasláno: 15. 12. 2011, 11:40:24
nowis:
Omlouvám se za hloupý dotaz, začínám pomalu chápat ten první příspěvek. Spíše teď nechápu, co myslíte tím "na serveru". Tím myslíte někde v databázi? (doufám, že to není ještě hloupější dotaz :-)) mám to uděláno takto: <FORM> <INPUT TYPE=TEXT NAME=VSTUP[A]> <INPUT TYPE=TEXT NAME=VSTUP[B]> <INPUT TYPE=TEXT NAME=VSTUP[C]> </FORM> jestli to dobře chápu, tak tímto si rovnou v html formuláři definuju pole(?). a pak řeším požadavek na filtrování: $first = true; foreach ($_POST['VSTUP'] as $nazev => $hodnota) { if (!$first) { $where = $where.', '.$nazev.' = '.$hodnota; } if ($first) { $where = 'WHERE '.$nazev.' = '.$hodnota; $first = false; } } |
||
nowis Profil * |
#10 · Zasláno: 15. 12. 2011, 14:56:58
Tori:
tak už jsem to dal dohromady. Díky moc. if ($_POST['A'] <> '' || $_POST['B'] <> '' || $_POST['C'] <> '') { $mapa = array(A => $_POST['A'], B => $_POST['B'], C => $_POST['C']); $first = true; foreach ($mapa as $nazev => $hodnota) { if ($first == false && $hodnota <> '') { if ($hodnota <> '') $where = $where.', "'.$nazev.'" = "'.$hodnota.'"'; } if ($first == true && $hodnota <> '') { $where = 'WHERE "'.$nazev.'" = "'.$hodnota.'"'; $first = false; } } |
||
Časová prodleva: 12 let
|
0