Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Dorobienie nawigacji do kalendarza
Olsz4k
post
Post #1





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 26.07.2013
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No ale z czym masz problem? NIe umiesz dodac/odjac jeden od miesiaca?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jacobson
post
Post #3





Grupa: Zarejestrowani
Postów: 468
Pomógł: 36
Dołączył: 14.12.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No to lepiej w URL, bo jak zrobi nastepny/poprzedni to wlasnie poprzez link


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Olsz4k
post
Post #5





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 26.07.2013
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
markonix
post
Post #6





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
Olsz4k
post
Post #7





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 26.07.2013
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
com
post
Post #8





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Olsz4k
post
Post #9





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 26.07.2013
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
com
post
Post #10





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post
Olsz4k
post
Post #11





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 26.07.2013
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ć?
Go to the top of the page
+Quote Post
com
post
Post #12





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


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

Ten post edytował com 4.10.2013, 00:58:15
Go to the top of the page
+Quote Post
Olsz4k
post
Post #13





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 26.07.2013
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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!
Go to the top of the page
+Quote Post
com
post
Post #14





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 05:32