Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Pobranie i rozdzielenie planu zadan na tydzien.
Forum PHP.pl > Forum > Przedszkole
bercow
Witam.

Stworzyłem sobie tabele, jak nizej, i teraz w tabeli kazde zadanie ma jakis czas dzien/od/do/powtarzalnosc, staram sie zrobic wystetlanie tych zdazen, ale jak np. wybrac tylko te ktore sa w poniedzialek. Samo zapytanie to SELECT * FROM schedule WHERE visible = True AND stop_date > '$date' ORDER BY date DESC Ale jak utworzyc cos w stylu (2). Chcial bym aby rozwiazanie bylo bardziej wyrafinowane, niz 7 if'ow z opcja date(l) (male "L") dla wartosci z bazy
  1. CREATE TABLE schedule (
  2. id_schedule INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, //id zadania
  3. id_user INTEGER UNSIGNED NULL, //id usera zadania
  4. name TEXT NULL, //nazwa zadania
  5. description TEXT NULL, //opis zadania
  6. start_date DATETIME NULL, //czas startu
  7. stop_date DATETIME NULL, //czas konca
  8. revoked BOOL NULL, //czy anulowane
  9. cyclic BOOL NULL, //czy powtarzalne (cotygodniowe)
  10. visible BOOL NULL, //czy widoczne
  11. PRIMARY KEY(id_schedule)
  12. );


2.
Poniedzialek
----------------------------
08:00 - 12:00 Zadanie 1
16:00 - 20:00 Zadanie 2
Wtorek
----------------------------
18:00 - 22:00 Zadanie 3
22:00 - 00:00 Zadanie 4
Sroda
----------------------------
02:00 - 06:00 Zadanie 5
18:00 - 23:00 Zadanie 6
pmir13
Wbudowane WEEKDAY( start_date ) nie będzie wystarczająco wyrafinowane?
bercow
Natchnąłeś mnie do trochę innego rozwiązania. Ale nie rozumiem, dlaczego dla dzisiaj podaje mi 4 dzień tygodnia, jeżeli poniedziałek jest pierwszy (a nie jest) to mając dziś piatek, piątek jest piątym dniem, opierajac sie na ISO 8601, pierwszym dniem jest nadziela, wiec dzisiaj jest 6 dzień.

Zrobiłem to tak, ponieważ dzisiaj jest 4 dzien, dodaje jeden i mam 5, a wiec piatek, ale jak pokaze pierwszy dzien, to sie wysypie. Jakis pomysł, dlaczego pokazuje dzisiaj 4 dzień tygodnia.
Przykład dla dziś.
  1. $day = array('','','Wtorek','Środa','Czwartek','Piątek','Sobota','Niedziela','Poniedziałek);
  2. echo $day[date("N",date('Y-m-d')) + 1] ;
pmir13
Date jako drugi parametr wymaga inta, a ty mu dajesz inta, ale powstałego z dodania 1 do stringa, a php robi z tego 2012. Więc zamiast timestampa dostaje liczbę 2012, co jest jakąś tam bardzo starą datą.
bercow
Czyli taka magia, ale teraz zastanawiam się, jak wybrać dane z bazy i je ładnie podzielić, na te dni. Mam dzień tygodnia, ale, teraz if ... elseif ... i tak siedem razy, to słabe wyjście.
  1. $day = array('Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota');
  2. echo $day[date("N",strtotime(date('Y-m-d')))] ;
pmir13
Zakładając, że pobierasz dane posortowane wg daty:
  1. $res = zapytanie($sql);
  2. $dzien = 7; // mozliwe dni 0-6
  3. while( $rekord=mysql_fetch_array($res) )
  4. {
  5. if( numer_dnia( $rekord ) != $dzien ) // zmienił się numer dnia
  6. {
  7. $dzien = numer_dnia( $rekord );
  8. nazwa_dnia_i_linijka($dzien);
  9. }
  10. szczegoly_zadania( $rekord );
  11. }

Taki ogólnie schemat, pod te niby-funkcje podstaw własny kod.
Problem byłby gdyby dwa sąsiadujące datą zadania byłyby np w sobotę i następną sobotę, wtedy mógłbyś np w zapytaniu dodać
  1. SELECT *, datediff( start_date, '$date' ) AS uplynelo_dni FROM ...

w linii 5 porównywać czy zmieniła się liczba uplynelo_dni, a nazwę dnia brać z $day[ ($numer_dnia_start + $uplynelo_dni) % 7 ]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.