Autor | Zpráva | ||
---|---|---|---|
norwayfishing Profil |
Zdravím, mám položku Select, kde se mi zobrazují v Option roky (pomocí cyklu for):
<SELECT name="rok"> <?php for($rok=2015; $rok<2031; $rok++){ echo("<option value=\"$rok\">$rok</OPTION>"); } ?> </SELECT> Chtěl bych aby jedna (třeba ta úplně první) byla položka Všechny roky (v POSTu pak bude proměnná "*"). Tato proměnná pak slouží v dotazu do databáze jako Where: $sql_selectclen="SELECT polozka1, polozka2, polozka3 FROM tabulka1 WHERE rok=$rok" or die(mysql_error()); Máte nápad jak na to? Díky |
||
lionel messi Profil |
#2 · Zasláno: 25. 9. 2015, 22:26:17
norwayfishing:
<SELECT name="rok"> <option value="*">Všechny roky</option> <?php for($rok=2015; $rok<2031; $rok++){ echo("<option value=\"$rok\">$rok</OPTION>"); } ?> </SELECT> |
||
norwayfishing Profil |
Díky, jenže jsem narazil na další problém a to jsem si prve neuvědomil, že do WHERE nelze dát * -- jsem to ale trouba
Nenapadá tě jiné řešení, kde bych jako výsledek dotazu získal všechny záznamy pro všechny uložené roky v tabulce ? Komplikovanější je to v tom, že je tam ještě jedna podmínka a to číslo uživatele a navíc je to joinovaný dotaz. Pokud bych měl řešit pouze všechny roky (bez ohledu na vybraného uživatele v db) , tak je to triviální Celé znění SQL dotazu: $sql_selectclen="SELECT clenove.clen_id, clenove.jmeno, clenove.prijmeni, sum(brigady.pocet) as `pocet` FROM clenove LEFT JOIN brigady ON clenove.clen_id = brigady.clen_id WHERE clenove.clen_id=$id and brigady.rok=$rok" or die(mysql_error()); Tak už mě asi napadlo jak to udělat. Musím před seskládáním dotazu pomocí podmínek nahradit celý řetězec and brigady.rok=$rok buď za prázdnou hodnotu, nebo ten řetězec celý ponechat. Vyzkouším a dám vědět, ale fungovat by to mělo.
|
||
Joker Profil |
norwayfishing:
Vždyť je celkem jedno, jaká přesně hodnota bude mít význam „všechny“, stejně ta hodnota nemůže jít do SQL dotazu přímo, jak je naznačeno v [#2], protože SQL injection. Příklad, pokud se teda dotaz skládá přes řetězce: $rok = intval($_POST["rok"]); $where = "clenove.clen_id=" . $id; if ($rok > 0) { $where .= " AND brigady.rok = " . $rok; } if (strlen($where) > 0) { $where = " WHERE " . $where; } $sql = "…" . $where; A pro úplnost připomínám: 1. Rozšíření mysql (funkce mysql_*) je zastaralé, v PHP 7 už nebude vůbec, tudíž se nedoporučuje ho používat pro nový kód. 2. Zakončovat dotazy or die(mysql_error()) je přijatelné během testování, ale v ostré verzi by to být nemělo.
|
||
norwayfishing Profil |
Tak jsem měl pravdu, funguje to. Jen jsem to dal do SWITCHE, ne do IFu
Díky za pomoc Add 1. Jo o nepodporování mysql vím. Web mi jede na PHP 5.3. Add 2. Je to teprve testovací verze na localhostu |
||
Alphard Profil |
#6 · Zasláno: 25. 9. 2015, 23:31:24
norwayfishing:
„Add 1. Jo o nepodporování mysql vím. Web mi jede na PHP 5.3.“ „Add 2. Je to teprve testovací verze na localhostu“ Nejde o to, co je teď, ale co bude v budoucnu. Kód, který jste se sem doposud vkládal nese zjevné znaky toho, že jste nezkušený. Podívejte se třeba na konstrukci for($rok=2015; $rok<2031; $rok++) Tady by zřejmě bylo lepší vyjít z aktuálního roku, tak např. for($rok = (int)date('Y'); $rok < date('Y')+16); $rok++) Pro přístup k databázi doporučuji dibi. |
||
norwayfishing Profil |
Alphard:
> Tady by zřejmě bylo lepší vyjít z aktuálního roku, tak např. for($rok = (int)date('Y'); $rok < date('Y')+16); $rok++) Vycházet z aktuálního roku nemohu, neboť chci tahat z db i informace z let před aktuálním rokem. Proto mám nastaveny roky "natvrdo". A "rok 0" pro projekt (tedy startovací rok) je 2015. Dále nepočítám s tím, že projekt bude mít životnost delší než 15 let. Ale dalo by se to asi upravit následovně: for($rok = 2015; $rok <= date('Y'); $rok++) for($rok = 2015; $rok <= date('Y')+1); $rok++) „Kód, který jste se sem doposud vkládal nese zjevné znaky toho, že jste nezkušený.“ Já se taky za zkušeného programátora nepovažuji :-) |
||
Časová prodleva: 9 let
|
0