Autor Zpráva
n3ox
Profil *
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
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.
misak113
Profil *
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...

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: