Autor Zpráva
smiesek
Profil
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 *
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
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
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
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
Kajman:
no jo, ale já tam potřebuju ten název měsíce, nyní mi to vypisuje číslo
Kajman
Profil
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
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
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
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
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
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
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);
Po tomto již proměnné $rok a $mesic budeš mít definované

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
Je lepší provádět s přímo zadaným rozsahem datumů, třeba pro září 2015:
SELECT nazev,  datum FROM udalost WHERE datum >= '2015-09-01' AND datum < '2015-10-01'
Je to sice složitější na zapsání (musíš připočítávat jedničku k měsíci (a k roku pokud je prosinec)), ale databáze pak může efektivnějši používat indexy. Zatím tě to trápit nemusí; pokud budeš mít v databázi méně jak řekněme milion záznamů, rozdíl nepoznáš.
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
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í

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: