| 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: 12 let
|
|||
0