Autor Zpráva
Smoother
Profil
Ahoj,
mám problémek s filtrováním údajů z db. Ve formuláři mám u různých údajů položky, pokud není žádná zadána, odešle se údaj "vyberte". Třeba:
<select name="plocha1" size="1" dir="ltr" lang="cs" value="">
	<option>vyberte</option>
         <option>80</option>
	<option>100</option>
 	<option>150</option>
	<option>200</option>
	</select>


V souboru zpracovavající formulář a provádějí výpuis z db pak mám podmínku:
    if ($plocha1=='vyberte') {
    $plocha1='IS NOT NULL';
    }


a pak:
"SELECT * FROM neco WHERE velikost = '".$velikost1."' AND neco = '".$neco1."' AND plocha >= '".$plocha1."'"


Otázka zní:
když někdo chce omezit výběr pouze pomocí jednoho údaje (nebo několika), potřebuji aby všechny ostatní omezující podmínky byly vypsány všechny (jako že na nich nezávisí). Jak na to?
Díky předem
Smoother
TSD
Profil
   if ($plocha1=='vyberte') {
    $plocha1=" AND plocha >='.$_REQUEST['plocha1'];    }
else {
    $plocha1=""  ;  };


SELECT * FROM neco WHERE velikost = '".$velikost1."' AND neco = '".$neco1."' ".$plocha1


doufám že jsem někde nezapomněl závorku :)
Smoother
Profil
díky moc, zoušel jsem a nějak mi to nefunguje...
Nenapsal jsi tu pomínku naopak? když plocha==vyberte - pak zobraz všechno, jinak "co je vybráno":

if ($plocha1=='vyberte') {
     $plocha1="IS NOT NULL"  ;    }
else { $plocha1=" AND plocha >='.$plocha1;
     };


formulář posílám přes GET a mám nad zpracováním:
$plocha1=$_GET["plocha1"]; 
trakže tady chyba snad není...

Možná jsme se nepochopili už v zadání:
Potřebuji aby když někdo nic nevyplní, vypíše se obsah celé db, pokud vyplní některé omezující podmínky, dojde o omezení výběru, ale ostatní podmínky jakoby neměly vliv (což je asi klasika ve filtrování).

Díky předem
Smoother
los
Profil *
Najjednoduchšie podľa mňa takto:
$where = array();

if (isset($_GET['plocha1']) && $_GET['plocha1'] != 'vyberte')
    $where[] = 'plocha>=' . (int)$_GET['plocha1'];

if (isset($_GET['neco1']))
    $where[] = "neco1='" . mysql_real_escape_string($_GET['neco1']) . "'";

$query =
  'select * from neco' .
  ($where ? ' where (' . implode(')and(', $where) . ')' : '');

(netestované, takže tam môžu byť chyby, ale princíp je zrejmý)
TSD
Profil
Smoother
Potřebuji aby když někdo nic nevyplní, vypíše se obsah celé db, pokud vyplní některé omezující podmínky, dojde o omezení výběru

Proč prostě tuhle větu nepřepíšeš do toho sql a pořád se tam snažíš natlačit to IS NOT NULL? Prostě když bude nevybráno (= bude vybráno "vyberte"), tak tu podmínku do sql vůbec nedávej.

Ještě jednou:

když $plocha1 = "vyberte", tak $kus_sql = "" , jinak $kus_sql = " AND plocha >=".$plocha1


SELECT * FROM neco WHERE velikost = '".$velikost1."' AND neco = '".$neco1."' ".$kus_sql
Smoother
Profil
Pánové díky moc! Rozjel jsem to... Pokud byste byli ochotní mi pomoci ještě s podmínkou budu vděčný... Pokud možno bez použití tříd... :o)

to IS NOT NULL jsem tam dával proto, když nikdo nevybere nic, tak aby mi to vypsalo všechny údaje... Stejně mi to ale nefunguje... :-/

Nevím si rady s tím, když někdo zadá třeba 3 údaje do formuláře a výsledek má být ...
WHERE 1=a AND 2=b AND 3=c
... jak napsat tu podmínku (WHERE před proměnou 1 před dalšími proměnými AND).

Nemůžu vědět kolik a které omezující podmínky uživatelé použijí...

Napadlo mě rozkouskovat to do proměnné třeba
$kussql
a zjišťovat které údaje byly zaslány z formuláře. Ale jednak jsem se zaseknul a navíc se mi to zdá zbytečně složíté.

Výsledek by měl vypadat třeba takhle:
SELECT * FROM domy WHERE mesto = 'North Port' AND typ = 'Bungalov' AND plocha >= '100'


"SELECT * FROM domy  WHERE mesto = '".$mesto1."' ". $typ1." ". $plocha1." ". $mistnosti1." ". $cenaod1." ". $cenado1." "


Díky moc
Smoother
Mastodont
Profil
Vždyť ti to popsal už los, prostě podmínky přidáváš do pole a pak je přes implode spojíš.
Smoother
Profil
Mastodont
...vím, ale dost dobře tomu zápisu nerozumím...
Snad by se ty podmínky daly rozepsat srozumitelněji...

edit: tedy tomu spojování pomocí implode...

jsem lama, ale snažím se...
Mastodont
Profil
Implode spojí všechny prvky pole do řetězce a vloží mezi ne to, co zadáš jako první argument. Vyzkoušej si ten kód.
Smoother
Profil
Funguje, super, díky všem!!!

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: