21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
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
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
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++)
bude se za 3 měsíce a pár dnů chovat správně? Budete na Nový rok nebo někdy později přepisovat zdrojáky?
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++)
a podobně u dalších věcí myslete na budoucnost.

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++)
nebo pro jistotu možná
for($rok = 2015; $rok <= date('Y')+1); $rok++)
Protože je jasné že v letech, které teprve nastanou, žádná akce proběhnout ještě nemohla - díky za tip ;-)

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 :-)

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