Autor | Zpráva | ||
---|---|---|---|
n3ox Profil * |
#1 · Zasláno: 30. 5. 2015, 02:08:36
potřebuji poradit nějaký vzorec nebo cyklus na WHERE.
mám tyto proměnné které mohou být plné nebo prázdné. $kraj1=$_POST['kraj']; $okres1=$_POST['okres']; $mestocast1=$_POST['mesto']; $datum=$_POST['datum']; $cas=$_POST['cas']; $misto=$_POST['misto']; $plemen=$_POST['plemen']; a klasickej dotaz: $sql=mysql_query("SELECT * FROM tabulka WHERE ....."); pokud bych napsal extra dotaz pro všechny kombinace tak jich bude 128, což je blbost. předem nevím které z proměnných budou mít hodnotu a které budou prázdné Nevíte co s tím? |
||
Alphard Profil |
#2 · Zasláno: 30. 5. 2015, 03:08:33
A co podmínky? Nejlépe ten dotaz poskládat pomocí dibi
$query = $db->select('*')->from('tabulka'); if (!empty($_POST['kraj'])) { $query->where('kraj = %s', $_POST['kraj']); } if (!empty($_POST['cas'])) { $query->where('cas = %t', $_POST['cas']); } // ... $data = $query->fetchAll(); Což by se při aplikaci na celé $_POST (nebo vhodně definovanou podskupinu) dalo (za cenu omezení definice datových typů) zkrátit na
$query = $db->select('*')->from('tabulka'); $filter = array_filter($_POST['filter']); $query->where('%and', $filter); $data = $query->fetchAll(); Řešení bez dibi je myslím zřejmé. Jen dodám občas používaný workaround (který osobně považuji za nehezký) dát jako první where podmínku např. 1=1 , aby se pak mohlo připojovat and sloupec=val bez podmíněného přidávání and .
|
||
Časová prodleva: 7 dní
|
|||
misak113 Profil * |
#3 · Zasláno: 5. 6. 2015, 20:07:48
Požij třeba nějakou knihovnu... dobrá je underscore, ale pokud to chces plain, tak treba:
$whereParts = []; foreach ($_POST as $key => $value) { if (in_array($key, ['kraj', 'okres', 'mesto', 'datum', 'cas', 'misto', 'plamen'])) { $whereParts[] = $key . ' = ' . mysql_escape_string($value); } } if (!empty($whereParts)) { $query = mysql_query("SELECT * FROM tabulka WHERE " . implode(' AND ', $whereParts)); } else { die('No results'); } Ale psát takhle scripty je dnes v domě vyspělých frameworků už pase... |
||
Časová prodleva: 10 let
|
0