PHP týden Letní akce
Pouze tento týden sleva až 80 % na kurzy PHP. Lze kombinovat s akcí Letní slevy na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Diskuze: Událost přes více dnů v kalendáři

Aktivity (1)
Avatar
Matěj Zábojník:9. března 12:29

Ahoj, řeším problém s událostmi v kalendáři, které jsou naplánované přes více dnů. Ve své databázi mám tabulku s událostmi, kde mám sloupce "datum od" a "datum do". Nejsem si jistý jak mam strukturovat SQL dotaz, aby mi vybral všechny dny mezi těmito daty. Lze toho vůbec dosáhnout? Níže uvedu ukázku současného dotazu.. V dotazu ještě nemám zapracovaný ten "datum do".

for ($den = 1; $den <= $pocetdnu; $den++, $zacatekmesice++) {
    $datum = $ym . '-' . $den;
    $result = Db::query('
        SELECT name, notes
        FROM udalosti
        WHERE date =?
', $datum);

    if($result > 0){
        if($dnes == $datum){
            $tyden .= '<td id="todayevent"><div class="ring-container"><div class="ringringred"></div><div class="kolecko-cervene"></div></div><a class="odkaz" href=showevent.php?ymd='.$datum.'>';
        }

For cyklem si vypisuji jednotlivé dny měsíce do políček kalendáře. SQL dotazem se ptám, zda-li je nějaká událost pro určitý den. Když se dostanu k if cyklu, ten proběhne pouze pokud ta událost je, což je asi z kódu pochopitelné... No a den s událostí mám nějak v css ostylovaný.

Chci docílit: Mým cílem je obarvit si všechny políčka mezi "datum od" a "datum do". Jde to tímto způsobem vůbec nějak?

Díky za případné rady.

 
Odpovědět 9. března 12:29
Avatar
Odpovídá na Matěj Zábojník
Michal Štěpánek:11. března 8:08

zkusil bych třeba podmínku

WHERE datum BETWEEN datum_od AND datum_do
Nahoru Odpovědět 11. března 8:08
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11. března 9:59

Podminkou je, ze sloupec musi byt casove razitko, timestamp, mozna datetime (integer cislo). Pokud to mas jako string, tak ti

datum BETWEEN datum_od AND datum_do -- ani
datum_od<datum AND datum<datum_do -- nepomuze.
 
Nahoru Odpovědět 11. března 9:59
Avatar
Odpovídá na Michal Štěpánek
Matěj Zábojník:11. března 17:54

Tohle jsem nemyslel..asi jsem to špatně vysvětlil. Jde mi o to, že já si zadám do 2 inputů ve formuláři 2 datumy. Jeden je datum_od a druhý datum_do. Což je rozsah plánované události. No a já když mám na vybraný den událost, mám tam nějakou td class, tudíž si ho například podbarvím. No a jde mi o to, abych nějakým způsobem získal ty dny mezi těmito dvěma daty, abych si mohl nastavit td class u celého rozsahu těch dnů.. Asi to bude nejjednodušeji řešené přes pole, ale možná je nějaký jiný způsob, tak se raději ptám ;)

Snad jsem to vysvětlit tentokrát srozumitelně.

 
Nahoru Odpovědět 11. března 17:54
Avatar
Odpovídá na Peter Mlich
Matěj Zábojník:11. března 18:03

jinak sloupce mám ve formátu date, takže tento příkaz funguje.. jen to není to, co potřebuji

 
Nahoru Odpovědět 11. března 18:03
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11. března 20:53
SELECT x, y, z, DATE_SUB(date_do, date_do) as pocet_policek_k_obarveni FROM tabulka
 
Nahoru Odpovědět 11. března 20:53
Avatar
Odpovídá na Matěj Zábojník
Tomáš Novotný:11. března 21:00

jednoduše se zeptáš DB ... existuje nějaká událost jejíž počáteční datum je <= a zároveň koncové datum >= než datum v políčku kalendáře
jak píší kluci

WHERE datum BETWEEN datum_od AND datum_do -- nebo
WHERE datum_od <= datum AND datum <= datum_do

oba zápisy vybírají tzv. uzavřený interval tj. i krajní hodnoty

Nahoru Odpovědět 11. března 21:00
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Tomáš Novotný
Peter Mlich:12. března 7:24

Jo, ale jemu unikaji zakladni programovaci znalosti :) Vytahne z tabulky radek s intervalem a ted potrebuje z toho ziskat pocet policek, ktera ma obarvit. Coz samozrejme muze spocitat uz na urovni sql dotazu. A nebo pouzit pro cyklus podminku

for ($i = $datum_od; $i<$datum_do; $i++) // v pripade, ze to prevede
// z DATE sql prikazem na timestamp (integer) a nebo to muze
//prevest pomoci php, date(), time().
Editováno 12. března 7:25
 
Nahoru Odpovědět 12. března 7:24
Avatar
Odpovídá na Peter Mlich
Tomáš Novotný:12. března 7:53

Pokud vím, tak to má uděláno tak, že chce obarvit dané pole kalendáře podle toho zda existuje alespoň jedna událost... takže se dotazuje na každý den, protože je to zahrnuto v cyklu pro "vykreslování" kalendáře. To s čím zápasí, pokud správně chápu, je, že když má událost od 01-01 do 10-01, tak chce obarvit i pole 02-01 až 09-01...
Neřeším, že tento způsob třeba nemusí být efektivní. Protože jak jsi zmínil, znalosti se kterými pracuje jsou omezené.
Navíc úplně nevím jak mu to funguje, když dotaz který píše že používá je

    $result = Db::query('
        SELECT name, notes
        FROM udalosti
        WHERE date =?
', $datum);

    if($result > 0){....

a v podmínce nemá datum_od ani datum_do a přitom píše, že v DB sloupce má...
takže jak toho docílit tu napsáno má, nabádal jsem ho, že by bylo dobré prostudovat zdejší materiály...
ať zkouší a učí se :-)

Editováno 12. března 7:56
Nahoru Odpovědět 12. března 7:53
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Tomáš Novotný
Peter Mlich:12. března 8:11

Aha, ty jo, mas pravdu. V tom kodu jde den po dni a pro kazdy vola sql dotaz.
A ja uvazoval spis o vlastnim reseni, kdy vytahnu jednim sql dotazem vsechny radky, ktere budou mit co docineni s danym mesicem.
Ale ta podminka bude stejna.

To by mozna bylo lepsi to resit pres UNION do jednoho dotazu. Neco takoveho

$query = array();
$query[] = "SELECT name, notes, 1 as den  FROM udalosti  WHERE datum BETWEEN ? AND ?";
$query[] = "SELECT name, notes, 2 as den  FROM udalosti  WHERE datum BETWEEN ? AND ?"; // ... cyklem
$query = implode('  UNION ALL ', $query);
$result = Db::query($query, $datum_od_pro_1, $datum_do_pro_1, $datum_od_pro_2, $datum_do_pro_2...); // nebo jestli se tam da napsat array s hodnotami, neznam jeno sql-php kod

Pak to cyklem vypsat do pole policek. A pak z toho pole az generovat html tabulku.

Editováno 12. března 8:11
 
Nahoru Odpovědět  +1 12. března 8:11
Avatar
Odpovídá na Peter Mlich
Matěj Zábojník:13. března 18:56

Díky za rady kluci..

Jak psal Tomáš výše, to co popisuje je můj problém. To jak spočítat dny mezi tím jsem věděl.

Nějak to vymyslím.

 
Nahoru Odpovědět 13. března 18:56
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.