Autor | Zpráva | ||
---|---|---|---|
David R. Profil * |
#1 · Zasláno: 30. 8. 2014, 00:38:57
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"]."'"); 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 * |
#3 · Zasláno: 30. 8. 2014, 01:26:09 · Upravil/a: David R.
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 * |
#6 · Zasláno: 30. 8. 2014, 12:04:58 · Upravil/a: David R.
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 |
#7 · Zasláno: 30. 8. 2014, 12:19:32
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 |
#8 · Zasláno: 30. 8. 2014, 12:20:30
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 * |
#10 · Zasláno: 30. 8. 2014, 12:21:21
juriad:
díky moc, bylo to tím |
||
Časová prodleva: 10 let
|
0