Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Blokowanie wyboru godzin w wygenerowanej tabeli
Forum PHP.pl > Forum > PHP
wbeatn
Witam.

Sprawa wygląda następująco.
Za pomocą skryptu generuje listę komorek tabeli z godzinami rózniącymi się 30 minutami.
Od godz. 10:00 (pierwsza) do 19:30(ostatnia) - razem jest ich 20.

W bazie danych mam wpis z ktorego pobieram zawartość 'hour' i 'hourend'.
Chodzi o to, że w trakcie generowania tej tabelki z godzinami, skrypt laczy się z baza danych i sprawdza czy istnieje wpis z godzina, ktora ma wygenerowac. Jesli istnieje, to ta godzina oraz kolejne (od 'hour' do 'hourend') powinny wyswietlic się jako niewybirealne.

Problem lezy w tym, że skrypt sprawdza tylko jeden wpis w tabeli i jeśli w bazie sa wpisy, ktore powinny spowodowac niewybieralność godzin np. od 11:00 do 13:30 i 15:30 do 18:00, to niewybieralnym robi się jeden zakres godzin, a drugi pozostaje z mozliwoscia wyboru.

Probowałem bawic się w foreach i while ale jakoś nie potrafiłem dojsc do oczekiwanego efektu. Jesli przy uzyciu ich wszystko sie wyswietlało bez błedów to tak czy owak sugerujac się tylko jednym wpisem.

  1. $i = 0;
  2.  
  3. $lkw = 5; // liczba komórek w wierszu
  4. $ld = 20; // liczba danych do wyswietlenia
  5.  
  6. $h = 9;
  7.  
  8. for($n=1;$n<=$ld;$n++)
  9. {
  10.  
  11. if($n%2)
  12. {
  13. $h=$h+1;
  14. $m='00';
  15. } else {
  16.  
  17. $m='30';
  18.  
  19. }
  20.  
  21. $hm = $h.$m;
  22. $i++;
  23. if($i == 1)
  24. echo '<tr>';
  25.  
  26. $checkhr=safe_query("SELECT * FROM figiel.rezerwacje WHERE sala='".$_POST['salka']."'");
  27. $gh=mysql_fetch_array($checkhr);
  28.  
  29. foreach($gh as $grsh) {
  30. if($hm>=$gh['hour'] && $hm<$gh['hourend']){
  31. $grsh = '<td class="hourtd" style="color: #282">'.$h.':'.$m.'<br /><span>zarezerwowane</span></td>';
  32. } elseif($hm>1729) {
  33. $grsh = '<td class="hourtd" style="color: #282;padding: 30px 0;">'.$h.':'.$m.'</td>';
  34. } else {
  35. $grsh = '<td class="hourtd"><a onClick="java script:display('.$hm.')" class="ahourtd">'.$h.':'.$m.'</a></td>';
  36. }
  37. }
  38.  
  39. echo $grsh;
  40.  
  41. if($i == $lkw)
  42. {
  43. $i = 0;
  44. echo '</tr>';
  45. };
  46. };


Zupełnie nie wiem co mógłbym jeszcze zrobić. Czy moglibyście podzielić się jakimiś wskazówkami? Może są jakieś funkcje/komendy, które mi to ułatwia a ich nie używam? Początkujący jestem.
wizarts
Wklei przykładowe dane z tabel, bo dość mocno to pokręciłeś i wydaje mi się, że głównym problemem jest źle zaprojektowany model danych.

Proponuję:
tabela z definicją sali - szczegóły dotyczące sali ( numer sali, piętro, wyposażenie dodatkowe, ilość biurek, krzeseł, itp... )
tabela z godzinami - definicja godzin ( z iterwałem co 30 minut, czy ile tam potrzebujesz )
powiązania sali z godzinami z uzupełnieniem o status - tutaj będziesz miał szczegółową informację o dostępności sali
słownik ze statusami - zajęta, wolna, zarezerwowana, niedostępna, remont, itd...

to tak na szybko
wbeatn


Tego właśnie się obawiałem, że będę musiał przebudowywać bazę danych.
Poszedłem z leksza na łatwiznę.

Konkretnie to gdy tak nad tym siedzę, to brakuje mi tego, że przed rozpoczęciem generowania tabeli chciałbym żeby skrypt znał z tabeli wszystkie wartości pola 'hour' - z każdego wiersza i w momencie tworzenia tabeli gdy natrafi na wartośc komórki (zmienna $hm) zgodną z 'hour' znalezioną w bazie, to "drukuje" komórke i kolejne pięć bez możliwości wyboru ich wartości.

Dokładnie to widać w kodzie ... wybieralne mają w sobie link, niewybieralne nie

Ma ktoś jakieś pomysły bym nie musiał przebudowywać całej tabeli z mysql?
skarabe.pl
Bazy nie trzeba zmieniać, jest OK. Błąd (ten zasadniczy) znajduje się tutaj:

  1. <?php
  2. $checkhr=safe_query("SELECT * FROM figiel.rezerwacje WHERE sala='".$_POST['salka']."'");
  3. $gh=mysql_fetch_array($checkhr);
  4.  
  5. foreach($gh as $grsh) {
  6. if($hm>=$gh['hour'] && $hm<$gh['hourend']){
  7. $grsh = '<td class="hourtd" style="color: #282">'.$h.':'.$m.'<br /><span>zarezerwowane</span></td>';
  8. } elseif($hm>1729) {
  9. $grsh = '<td class="hourtd" style="color: #282;padding: 30px 0;">'.$h.':'.$m.'</td>';
  10. } else {
  11. $grsh = '<td class="hourtd"><a onClick="java script:display('.$hm.')" class="ahourtd">'.$h.':'.$m.'</a></td>';
  12. }
  13. }


W tym foreach'u iterujesz zupełnie nie po tym, po czym chcesz - sprawdź sobie co jest w zmiennej $gh. Spróbujmy tak (do zastąpienia jest tylko fragment który cytuję wyżej):

  1. <?php
  2. $checkhr=safe_query("SELECT * FROM figiel.rezerwacje WHERE sala='".$_POST['salka']."'");
  3. $sala_zajeta = false;
  4. while ($gh = mysql_fetch_assoc($checkhr)) {
  5. if ($hm >= $gh['hour'] && $hm <= $gh['hourend']) {
  6. $sala_zajeta = true;
  7. break;
  8. }
  9. }
  10.  
  11. if ($sala_zajeta) {
  12. $grsh = '<td class="hourtd" style="color: #282">'.$h.':'.$m.'<br /><span>zarezerwowane</span></td>';
  13. } elseif ($hm>1729) {
  14. $grsh = '<td class="hourtd" style="color: #282;padding: 30px 0;">'.$h.':'.$m.'</td>';
  15. } else {
  16. $grsh = '<td class="hourtd"><a onClick="java script:display('.$hm.')" class="ahourtd">'.$h.':'.$m.'</a></td>';
  17. }


W Twoim kodzie problemy są dwa: po pierwsze sprawdzasz tylko jeden wiersz w bazie ($gh = mysql_fetch_array() zwraca nie więcej niż 1 wiersz), a po drugie, nawet jakbyś pobrał więcej wierszy, to i tak zmienną $grsh wypełniasz wartością spełnioną przez ostatni z nich.
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.