Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Dorobienie nawigacji do kalendarza
Forum PHP.pl > Forum > Przedszkole
Olsz4k
Witam, jestem początkujący w php i codziennie staram się coś skrobać w kodzie.
Dzisiaj napisałem własny kalendarz z możliwością rezerwacji danego terminu. Tutaj nie ma z tym większych problemów. Problem wystąpił teraz, gdyż wyświetla mi tylko aktualny miesiąc i nie ma możliwości przewijania do przodu/wstecz.

Moje pytanie brzmi następująco: jak można dorobić takie strzałki? Nie chcę póki co umieszczać tutaj kodu, bo sprawa jest dosyć prosta, tylko ja nie wiem jak to technicznie rozwiązać. Mam zmienną $miesiąc, więc naturalnym jest, że po kliknięciu w "następny" powinno nastąpić $miesiąc+1, a w "poprzedni" $miesiąc-1, niestety nie wiem jak to rozwiązać, albo mam chwilowe zaćmienie. Za wszelkie wskazówki dziękuję.
nospor
No ale z czym masz problem? NIe umiesz dodac/odjac jeden od miesiaca?
jacobson
pewnie chodzi Ci o sam mechanizm zapisywania zeby bylo wiadomo ktory miesiac jest aktualnie brany pod uwage. Mozesz zapisac to w parametrze URL po wcisnieciu przycisku albo zapisywac chwilowo w sesji aktualny miesiac wyswietlany.
nospor
No to lepiej w URL, bo jak zrobi nastepny/poprzedni to wlasnie poprzez link
Olsz4k
Problem jest w tym, ze nie wiem jak zrobic ten caly mechanizm, ze wlasnie po kliknieciu nastepuje przeladowanie.
Jeszcze jest druga sprawa, czy dalo by sie to zrobic bez przeladowania strony? Rozumiem, ze wtedy
javascript by tylko wchodzil w gre?
markonix
Zrób to najpierw z przeładowaniem, a potem myśli o usprawnieniu tego ajaxem (kod się nie zmarnuje bo to będzie podobne).
Strzałki zrób w oparciu o linki bądź formularze GET - nie ma to większego znaczenia byle w linku przekazać wartość z miesiącem (no i raczej rokiem też..).
Dodatkowa korzyść to możliwość wysłania komuś linku z wyświetlaniem konkretnego miesiąca.
Olsz4k
Ok, jak zrobić to przez link już mniej więcej wiem. Jednak wszystko mam w funkcji, a zmienna $miesiac poza funkcja nie istnieje, dobrze rozumiem?

Wrzucam kod i proszę o małą pomoc jak go orientacyjnie zmodyfikować. Wiem, że funkcję mogę wyrzucić, jednak wtedy występuje mały problem z "kolorowaniem" dni zajętych, które się znajdują w bazie.

  1. <?php
  2.  
  3. $login = 'root';
  4. $pass = '';
  5. mysql_connect('localhost', $login, $pass);
  6. mysql_select_db('kalendarz') or die ("Błąd połączenia z bazą danych");
  7. mysql_query("SET NAMES utf8");
  8.  
  9.  
  10. function rysujKalendarz($miesiac, $rok)
  11. {
  12.  
  13. $sql = "SELECT dzien FROM kalendarz WHERE miesiac = ".(int)$miesiac." AND rok = $rok ORDER BY dzien ASC";
  14. $res = mysql_query($sql);
  15. $dni_zaznaczone = array();
  16.  
  17. while($row = mysql_fetch_array($res))
  18. {
  19. $dni_zaznaczone[] = $row['dzien'];
  20. }
  21.  
  22.  
  23. $znacznik = mktime(0, 0, 0, $miesiac, 1, $rok);
  24. $iledni = date("t", $znacznik);
  25. $start = date("w", $znacznik);
  26. $miesiace = array(
  27. "Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec",
  28. "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"
  29. );
  30.  
  31. // Rysowanie kalendarza
  32. echo '<table class="cal-table" cellspacing="0" cellpadding="2">';
  33. echo '<caption class="cal-caption">';
  34. echo '<p>'.$miesiace[$miesiac-1].' '.$rok;
  35. echo '<a href="index.html" class="prev">&laquo;</a>';
  36. echo '<a href="index.html" class="next">&raquo;</a> <tbody class="cal-body">';
  37. echo '</p></caption><tr>';
  38. echo '<tr><td>Nd</td><td>Pn</td>
  39. <td>Wt</td><td>Śr</td><td>Cz</td><td>Pt</td><td>So</td></tr>';
  40. echo '<tr>';
  41. if ($start>0)
  42. echo '<td colspan="'.$start.'" style="background: #ffffff;">&nbsp;</td>';
  43. else $pierwszy=true;
  44.  
  45.  
  46. for ($i=1;$i<=$iledni;$i++)
  47. {
  48. $dzien = date("w", mktime(0, 0, 0, $miesiac, $i, $rok));
  49. if ($dzien==0 and !$pierwszy) echo '</tr><tr>';
  50.  
  51. // Zajęty dzień - bg
  52. if (in_array($i, $dni_zaznaczone)) $bg = "background: red;";
  53. // Zwykły dzień - bg
  54. else $bg = "background: #fff;";
  55.  
  56.  
  57. $pierwszy = false;
  58. if (mktime(0, 0, 0, date("m"), date("d"), date("Y"))==
  59. mktime(0, 0, 0, $miesiac, $i, $rok)) $bg .= " font-weight:bold;";
  60. echo '<td style="'.$bg.'">'.$i.'</td>';
  61. }
  62. $koniec=7-($start+$iledni)%7;
  63. if ($koniec<>7) echo '<td colspan="'.$koniec.'"
  64. style="background:#ffffff;">&nbsp;</td>';
  65. echo '</tr></tbody></table>';
  66.  
  67. }
  68.  
  69.  
  70. rysujKalendarz(date("m"),date("Y"));
  71.  
  72. ?>
com
co do pierwszej kwestii to oczywiscie że $miesiac poza funkcja nie istnieje bo ta zmienna jest zmienna lokalna tworzoną podczas wywołania funkcji... tylko teraz pytanie w czym tkwi twój problem? bo albo ja jestem ślepy albo nie ma tu dalej kodu do zmiany tych miesiecy wiec czego od nas oczekujesz?
Olsz4k
Problem jest ze zmodyfikowaniem kodu tak, aby zmienna $miesiac wystepowala poza funkcja (chyba ze jakos inaczej mam ja przekazac do linku?), lub pomoc w calkowitym zlikwidowaniu funkcji.
com
  1. rysujKalendarz(date("m"),date("Y"));

przecież miesiąc pobierasz tutaj dokładnie odpowiada mu date("m") wiec nie potrzebujesz mieć dostępu do zmiennej z funkcji, skoro ona itak pobiera wartość z zewnątrz i jej nigdzie nie modyfikuje smile.gif

tak poza tematem to $rok też bym rzutował na inta wink.gif
Olsz4k
Ok, zrobiłem linki w ten sposób:

  1.  
  2. echo '<a href="offert.php?m='.(date('m')-1).'" class="prev">&laquo;</a>';
  3. echo '<a href="offert.php?m='.(date('m')+1).'" class="next">&raquo;</a>';
  4.  


w linku wszystko ładnie wygląda, ale kalendarz się nie przewija. Rozumiem, że teraz muszę tą zmienną zebrać jeszcze raz? Jak to zrobić?
com
pozostawienie tego w takiej surowej postaci może być niebezpieczne, ale ogl teraz robisz to tak że pobierasz wartość z $_GET a następnie przekazujesz ja do funkcji np tak rysujKalendarz((int)$_GET['m'],date("Y")); jeśli GET istnieje oczywiście bo jak nie to wywołujesz tak jak wcześniej smile.gif
Olsz4k
Super, już mi sie rozjasnilo i to bardzo, dziekuje.
Mam jeszcze pytanie odnosnie bezpieczenstwa, dlaczego taka forma moze byc grozna i jak ewentualnie cos takiego zabezpieczac?
Czy moj kod jest "dobry"? Chodzi o to czy nie robie jakis bezsensownych bledow.

Podbijam do góry... Bardzo proszę o informacje dlaczego taki zapis może być niebezpieczny i jak się przed tym chronić, lub jakiś odsyłacz, gdzie mogę o tym poczytać, dzięki!
com
chodziło mi o to, że np wywołanie adresu np strona.pl/offert.php?m=-1 mogło by spowodować nieoczekiwane błędy tak samo można by się w ten sposób pokusić o wstrzyknięcie zapytania do bazy czyli popularne http://pl.wikipedia.org/wiki/SQL_injection, ale tak jak napisałem konwersja na int jest poniekąd rozwiązaniem, ale tak czy tak przydało by się usunąć znaczniki html ze zmiennych, mimo iż teoretycznie nie liczba zostanie prze-konwertowana do nula(0) ale to już przed podaniem wartości -1 nie uchroni wink.gif
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.