Autor | Zpráva | ||
---|---|---|---|
smiesek Profil |
#1 · Zasláno: 7. 8. 2015, 06:10:13
Ráda bych prosila o radu, do databáze vkládám datum, které má sloupec typu date, datum se tedy vkládá v následujícím formátu: 2015-08-07
Následně jsem si vytvořila formulář pro vyhledávání záznamů dle data, tedy po úpravě podle měsíce. Nyní jde o to, že i když v dotazu použiju kouzelné DISTINCT, abych nedostávala duplicitní hodnoty záznamů, resp. měsíce, stejně je dostávám, protože je to pochopitelné, že se nejedná o stejné záznamy, když se liší číslo dne. Mou otázkou je, jaké je řešení úpravy data, abych bylo možné vypisovat pouze jednou název měsíce. Jestli to půjde, poprosím klidně pouze o nástin, zdali dojdu k nějakému smysluplnému řešení sama. Zkoušela jsem se inspirovat, jak jsou řešeny příklady pro tvorbu kalendáře, ale nepodařilo se mi nic dohledat, co by mě posunulo dále. Jinak ten formát data pro výpis select option si před použitím vložím do jednotlivých polí pomocí explode, pak tedy pracuju pouze s měsícem a případně rokem, které vypisuju. |
||
anonymníí Profil * |
#2 · Zasláno: 7. 8. 2015, 08:07:03
smiesek:
Vyber z databáze všechna data (potřebuješ všechny události v měsíci) a měsíc vypisuj jednou přímo až v aplikaci (kontroluj poslední záznam a současný Jestli mají stejný měsíc, nevypisuj ho, pokud se liší, vypiš). |
||
smiesek Profil |
#3 · Zasláno: 7. 8. 2015, 08:36:39
anonymníí:
třeba to myslíte dobře a nemohu to pouze já pochopit, ale z databáze vypisuju všechna data, to je OK, ale nyní mám formulář pro vyhledávání, kde chci podle option umožnit výběr všech záznamů podle měsíce, ale tak, aby se mi neduplikoval jejich název, jako se mi to stává nyní, protože z dotazu vybírám SELECT DISTINCT id, nazev, datum FROM udalost a právě ten sloupec datum obsahuje den,měsíc,rok <option value="$id">$datum</option> pro proměnnou $datum mám vytvořenou funkci, aby se vracel pouze měsíc a rok, to mi v pořádku vrací, ale ve výběru je pak třeba 4x srpen 2015 :/
|
||
juriad Profil |
#4 · Zasláno: 7. 8. 2015, 08:46:44
smiesek:
Polož další dotaz do databáze, který vrátí pouze měsíc a rok (ukázka vrací i počet záznamů v daném měsíci): SELECT YEAR(datum) AS year, MONTH(datum) AS month, COUNT(id) AS count FROM udalost GROUP BY YEAR(datum), MONTH(datum) ORDER BY 1, 2 |
||
smiesek Profil |
juriad:
ano, nyní mi to vypisuje pouze unikátní hodnoty, ale zase si nyní nevím rady s vhodnou úpravou pro výpis nikoliv čísla měsíce, ale názvu. Dříve jsem na to použila funkci, která mi jednotlivé hodnoty vložila do pole, ale jelikož nyní vypisuju již pouze měsíc a rok, nemohu tuto funkci využít. Jako možnost výpisu měsíce se mi jeví vytvořit pole hodnot 1-12 a názvy měsíce a ty následně předávat do prohlížeče, ale spíše mě ještě zajímá, zdali existuje i nějaká jiná funkce a možnost, kde bych pracovala přímo v funkcemi pro datum. Níže dávám ukázku, co nelze využít a co jsem využívala před doporučenou úpravou: Function RokMesic($datum = "") { $mesice = array("leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"); // názvy měsíců v poli $pole_datum = explode("-", $datum); $mesic = date("n", mktime(0, 0, 0, $pole_datum[1], $pole_datum[2], $pole_datum[0])); // MM-DD-RRRR $rok = date("Y", mktime(0, 0, 0, $pole_datum[1], $pole_datum[2], $pole_datum[0])); // MM-DD-RRRR return $mesice[($mesic)-1].' '.$rok; } Nelze tedy nyní použít tento tvar RokMesic($datum) != RokMesic($year)
Je mi jasné proč, ale nyní právě, zdali lze nějak upravit výše uvedenou funkci a nebo se nebát a napsat to jako osel pomocí pole $pole_mesice = array (1=> "leden", "únor" ... až "prosinec"); |
||
Kajman Profil |
#6 · Zasláno: 7. 8. 2015, 09:40:15
smiesek:
„Níže dávám ukázku, co nelze využít“ Lze to využít např. takto ... RokMesic($row['year'].'-'.$row['month'].'-01') Ale pro získání $mesic a $rok by v té funkci mělo stačit $mesic = (int)$pole_datum[1]; $rok = (int)$pole_datum[0]; |
||
smiesek Profil |
#7 · Zasláno: 7. 8. 2015, 09:41:45
Kajman:
no jo, ale já tam potřebuju ten název měsíce, nyní mi to vypisuje číslo |
||
Kajman Profil |
#8 · Zasláno: 7. 8. 2015, 09:50:26
Tak to asi nevypisujete výsledek funkce RokMesic. Ukažte, jak ty optiony generujete.
|
||
smiesek Profil |
Kajman:
já nevím co po mě chcete prostě mi to nyní vypisuje číslo a já chcu název měsíce tak se ptám jak to upravit a nebo to mám jak osel napsat do polí výsledek funkce se přece vypisuje jako RokMesic();
|
||
mimochodec Profil |
#10 · Zasláno: 7. 8. 2015, 10:01:20
smiesek:
„prostě mi to nyní vypisuje číslo a já chcu název měsíce“ Co přesně nevyhovuje na tomto? $mesice = array("leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"); // echo $mesice[$mesic-1]; |
||
smiesek Profil |
#11 · Zasláno: 7. 8. 2015, 10:03:56 · Upravil/a: smiesek
mimochodec:
teď jste to ale osekal, takže mám nedefinovanou proměnnou $mesic , no to asi nepůjde vypisovat názvy měsíců, tak to je jedno, když je to pokažené.funkci jsem upravila jako Function RokMesic($datum = "") { $mesice = array("leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"); // názvy měsíců v poli $pole_datum = explode("-", $datum); $mesic = $pole_datum[0]; // MM-DD-RRRR $rok = $pole_datum[2]; // MM-DD-RRRR return $mesice[($mesic)-1].' '.$rok; } pro option vypisuju jako RokMesic(($data['mesic']).' '.($data['rok'])) vrací chybu Undefined offset řádek chyby je $rok = $pole_datum[2]; // MM-DD-RRRR v optionu se mi pouze zobrazují názvy měsíců nikoliv už zase rok |
||
Keeehi Profil |
#12 · Zasláno: 7. 8. 2015, 10:20:12
smiesek:
Je dost nelogické ručně skládat řetězce dohromady „ ($data['mesic']).' '.($data['rok']) “ aby si to funkce zase musela dělit. „explode("-", $datum); “
function czechNamedMonths($month) { $months = array(1=>"leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"); return $months[$month]; } // použití echo czechNamedMonths($data['mesic']) .' '. $data['rok']; |
||
mimochodec Profil |
#13 · Zasláno: 7. 8. 2015, 10:21:48
smiesek:
Ta funkce dělá něco, co v tomto případě vůbec nevyhovuje a věc to komplikuje. Vůbec bych ji do toho netahal. Jaké je přesně zadání? V databázi je v tabulce sloupce datum. Mají se vypsat všechny řádky seskupené podle roku a měsíce nebo se mají vypsat jen všechny existující dvojice rok-měsíc? |
||
smiesek Profil |
#14 · Zasláno: 7. 8. 2015, 10:29:13
Dobrá dobrá, myslím, že již tedy vyřešeno a použiju úpravu Keeehi a juriada pro konečnou podobu.
Děkuju všem za příspěvky a trpělivost. Nyní se to již vypisuje dle mého požadavku. Mou snahou bylo: 1. vypisovat záznamy, které mají sloupec datum. 2. umožnit filtrovat záznamy v option na základě měsíce a roku (tedy seskupit tyto dvě hodnoty) dvojice měsíc-rok. |
||
mimochodec Profil |
Sice nevím, proč nestačí prostě tohle, ale ok.
SELECT * FROM tbl GROUP BY (MONTH( datum ) + 12*YEAR( datum )) |
||
juriad Profil |
#16 · Zasláno: 7. 8. 2015, 11:31:08
mimochodec:
Ano stačí, ale je to zbytečné. Používáš aritmetiku na něco, co zvládne databázový engine lepe. Databáze kvůli tomu nemusí použít nějaké optimalizace. |
||
smiesek Profil |
ještě bych ráda navázala na včerejší dotazy a dokončila funkci pro filtrování záznamu dle měsíce, společně s rokem.
Mám nějaké tušení, jak na to, ale nedokážu to dotáhnout do funkční podoby a celku. Stav a mé úvaha je následující: Požadavkem je vytáhnout z databáze všechny záznamy dle filtru, které mají sloupec datum typu date v následujícím formátu: 2015-08-01 dle měsíce, společně s rokem. Tedy např. vše: a) září 2015 b) říjen 2015 c) září 2016 Tedy ze včerejška za pomocí výše uvedeného se mi podařilo vytvořit formulář pro výběr (select) měsíce a k tomu rok, tedy nyní je chybou nefunkčnosti to, že číslo měsíce je přiřazeno jako value ze selectu, zatímco rok je automaticky pouze hodnota bez vstupu: SELECT YEAR(datum) AS rok, MONTH(datum) AS mesic FROM udalost <option value="$mesic">'.NazevMesice($mesic).' .'$rok'.</option>; takže když pak vypisuju vybrané záznamy dle: září 2016 automaticky se vypíšou i záznamy za září roku 2015, je to pochopitelné, mám takhle sestavený dotaz pro výběr dat: SELECT nazev, datum, MONTH(datum) AS mesic FROM udalost WHERE MONTH(ud.datum)=$mesic Aby to fungovalo tak jak požaduju, tak určitě bude nutná úprava dotazu na následující tvar: SELECT nazev, datum, MONTH(datum) AS mesic, YEAR(ud.datum) AS rok FROM udalost WHERE MONTH(ud.datum)=$mesic AND YEAR(ud.datum)=$rok to chápu, ale nyní mi dělá potíže jakým způsobem získat z toho optionu tu číselnou hodnotu pro ten rok, když hodnotu value mám pro číselnou proměnnou měsíce. Do formuláře pro filtrování tu hodnotu si myslím budu předávat pomocí hidden, ale dělá mi problém jak ji tam vůbec vlastně nadefinovat, protože pokud ji použiju jako: <input type="hidden" name="rok" value="'. $rok .'" /> což právě předpokládám, že proměnná $rok bude ze sloupce dotazu, který mi vypisuje měsíce (s roky) pro select: SELECT YEAR(datum) AS rok, MONTH(datum) AS mesic FROM udalost <option value="$mesic">'.NazevMesice($mesic).' .'$rok'.</option>; tak mi to hned píše, že hodnota $rok není definována, a nechávám si ji vypsat a její hodnota je 0. Tak netuším jak ji zapsat, aby se vědělo, že hodnota proměnné $rok je taková a maková a patří právě z toho výběru option>select. No, snad je to trošku srozumitelné oč mi jde a jestli mi jde trošku poradit, nebo alespoň naznačit, v čem je má úvaha (pokud o logické myšlení) správná a v čem je nepoužitelná a třeba dojdu sama na nějaké smysluplné použitelné řešení. Děkuju za váš čas a cenné rady |
||
juriad Profil |
smiesek:
Value u toho selectu nebude jen měsíc, ale kombinace obojího (třeba ve formátu odděleném pomlčkou: 2015-9) <select name="rokmesic"> <option value="$rok-$mesic">'.NazevMesice($mesic).' .'$rok'.</option> </select> To se pak bude pěkně zpracovávat v PHP (pomocí explode): list($rok, $mesic) = explode('-', $rokmesic); O hidden pole se nesnaž. Není šance to udělat správně. Navíc by to nefungovalo bez JS. Ještě poznamenám, že dotaz do databáze: SELECT nazev, datum FROM udalost WHERE MONTH(ud.datum)=$mesic AND YEAR(ud.datum)=$rok SELECT nazev, datum FROM udalost WHERE datum >= '2015-09-01' AND datum < '2015-10-01' |
||
mimochodec Profil |
smiesek:
„jakým způsobem získat z toho optionu tu číselnou hodnotu pro ten rok, když hodnotu value mám pro číselnou proměnnou měsíce.“ Hodnotou může být řetězec, tzn třeba i <option value="2015-10">
juriad předbíhá. |
||
smiesek Profil |
#20 · Zasláno: 8. 8. 2015, 12:45:46
juriad:
aha to mě nenapadlo ta kombinace, zkusím zapracovat doporučení, předpokládám i, že s těma proměnnými, resp. celým řádkem list budu pracovat po vyhodnocení, zdali bylo stisknuto vyhledávání, tedy isset($_POST['najit']) , ju?
Budu se snažit dojít k řešení a trochu se nad tím potrápit. |
||
smiesek Profil |
super děkuju kluci, netušila jsem, že hodnotou jak zdůrazňuje mimochodec a současně juriad aplikuje s příkladem, může být i řetězec, zase budu snad pro příště o něco vzdělanější a tedy zapracovala jsem doporučený postup a funguje to, prima :)
juriad: rozsah data jsem nevyužila z toho důvodu, že jako první jsem měla výpis záznamů od dnešního data až po ty budoucí a proto jako doplnění při výběru mě napadla podmínka s dotazem na rovnající se hodnotu sloupce databáze, avšak určitě je nyní možnost použít i ten rozsah, jak uvádíš, beru to tedy jako další možný způbov použití :-) spokojenost se vším, snad mi to vydrží při pokračování |
||
Časová prodleva: 10 let
|
0