Autor Zpráva
David R.
Profil *
Dobrý večer, potřeboval bych filtrovat následující 3 položky:

typ (novinka/článek)
kategorie (1,2,3,4 - vždy id kategorie)
rok (2013,2014)
$sql = MySQL_Query("SELECT * FROM data WHERE typ = '".$_GET["typ"]."' AND kategorie = '".$_GET["kategorie"]."' AND rok= '".$_GET["rok"]."'");
když použiju toto, tak to funguje parádně, nicméně musím vyplnit všechny údaje, šlo by udělat, když bych nevyplnil například rok, aby mi to vypsalo pouze podle typu a kategorie? (roky tedy všechny co jsou v db)

zkoušel jsme něco jako

if(empty($_GET["typ"])) { 
$sql = MySQL_Query("SELECT * FROM data WHERE kategorie = '".$_GET["kategorie"]."' AND rok= '".$_GET["rok"]."'");
}elseif(empty($_GET["kategorie"])) { 
$sql = MySQL_Query("SELECT * FROM data WHERE typ = '".$_GET["typ"]."'  AND rok= '".$_GET["rok"]."'");
}elseif(empty($_GET["rok"])) { 
$sql = MySQL_Query("SELECT * FROM data WHERE typ = '".$_GET["typ"]."' AND kategorie = '".$_GET["kategorie"]."'");
}

ale to je blbost asi ještě větší...
Jde mi o to, aby když něco nevyplním tak aby filtr běžel dál zkrátka
mimochodec
Profil
$q = "SELECT * FROM data WHERE 1=1"

if(!empty($_GET["typ"])) { $q .= " AND typ = '".mysql_real_escape_string($_GET["typ"])."'"; }
if(!empty($_GET["kategorie"])) { $q .= " AND kategorie = '".mysql_real_escape_string($_GET["kategorie"])."'"; }
if(!empty($_GET["rok"])) { $q .= " AND rok = '".mysql_real_escape_string($_GET["rok"])."'"; }

$sql = MySQL_Query($q);
David R.
Profil *
mimochodec:
Díky moc, vypadá že funguje parádně :)


Ještě mohl bych se zeptat co znamená to 1=1 ?


Ještě malej dotaz, když doplním do dotazu: order by id LIMIT {$sql_start}, {$sql_limit}

$q = "SELECT * FROM dataWHERE 1=1 order by id LIMIT {$sql_start}, {$sql_limit}";

tak mi to nic nenajde
mimochodec
Profil
1=1 je podmínka, která je vždy splněna. Slouží jen k tomu, abys zabránil syntaktické chybě SELECT * FROM data WHERE AND typ = 4. Dalo by se to řešit i tak, že bys u každého z těch tří řádků hlídal, jestli v případě, že se má použít, je první. Tzn použilo by se buď AND typ = , nebo typ = . Ale to by bylo o tři if else víc. Toto je myslím elegantnější.


Syntaxi s chlupatýma závorkama už jsem někde viděl, ale nepochopil, šlo to nějak mimo mě. Použij prostě "... LIMIT ".$sql_start.", ".$sql_limit
Alphard
Profil
David R.:
Ještě mohl bych se zeptat co znamená to 1=1 ?
Je to takový workaround, jak vysvětluje sám autor :-), lepší je sáhnout po dibi nebo jiné prokročilejší databázové vrstvě, která řeší hromadu podobných problémů mnohem elegantněji.

mimochodec:
Syntaxi s chlupatýma závorkama už jsem někde viděl, ale nepochopil
Nejlepší je kouknout přímo do manuálu. Umožňuje správně interpretovat proměnné v řetězcích i ve složitějších případech (vícerozměrná pole, objekty, pokračování alfanumerického znaku ihned za proměnnou apod. Všechny tyto věci lze zároveň řešit ukončením řetězce, spojením proměnné a začátkem nového řetězce.
V tomto konkrétním případě to nemá význam. Zvlášť v PHP se často všude válí hromady kódu, které není dobré bezmyšlenkovitě kopírovat.
David R.
Profil *
Alphard:
Díky, dibi používám, ale v tomhle případě bych vůbec netušil jak na to


stránkování mi už funguje, nicméně když to mám

$q = "SELECT * FROM data WHERE 1=1";
 
if(!empty($_GET["typ"])) { $q .= " AND typ = '".mysql_real_escape_string($_GET["typ"])."'"; }
if(!empty($_GET["kategorie"])) { $q .= " AND kategorie = '".mysql_real_escape_string($_GET["kategorie"])."'"; }
if(!empty($_GET["rok"])) { $q .= " AND rok= '".mysql_real_escape_string($_GET["rok"])."'"; }
$q .= "order by id LIMIT ".$sql_start.", ".$sql_limit.""; 
$sql2 = MySQL_Query($q);

a nevyberu žádný údaje nic to nenajde(když vyberu alespon jeden tak ano), když odstraním $q .= "order by id LIMIT ".$sql_start.", ".$sql_limit.""; tak to funguje normálně
juriad
Profil
Možná je to tím, že před order nemáš mezeru.
A opravdu nemusíš na konec řetězce přidávat prázdný řetězec, tedy:
$q .= " ORDER BY id LIMIT " . $sql_start . ", " . $sql_limit;
mimochodec
Profil
Alphard:
Nejlepší je kouknout přímo do manuálu.
Mě to popravdě ani nezajímá. Mám svoje dlouho zažité konstrukce a nepotřebuju testovat něco nevyzkoušeného.

David R.:
a nevyberu žádný údaje nic to nenajde
Vypiš si to echem, uvidíš to.
Alphard
Profil
Protože tam chybí mezera. SQL konstrukci 'order zřejmě pochopí, ale 1order ne.
Zjistil byste to, kdybyste si vypsal chybovou hlášku. Ten kód je plný věcí svědčících o tom, že byste si měl zopakovat základy. Pak byste třeba i zjistil, jak tady elegantně použít dibi.

$select = $db->select('*')->from('data');
if (!empty($_GET["typ"])) $select->where('typ = %s', $_GET["typ"]);
// ...
$select->limit($limit);
David R.
Profil *
juriad:
díky moc, bylo to tím

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:

0