Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Kaburagi

[SQL/PHP] Uzupełnianie pustych

Rekomendowane odpowiedzi

Witam,

 

to funkcja wypisująca uczniom frekwencję

 

function nieobecnosci()
{
	$previous = '';
	$wynik = mysql_query("select nieobecnosci.id_nieobecnosci, nieobecnosci.data, nieobecnosci.godzina_lek, nieobecnosci.temat, przedmiot.przedmiot, nb.nb, uczen.imie, uczen.nazwisko, nauczyciel.imie, nauczyciel.nazwisko from(nieobecnosci inner join uczen on nieobecnosci.id_uczen = uczen.id_uczen)inner join przedmiot on (nieobecnosci.id_przedmiot = przedmiot.id_przedmiot)inner join nb on (nieobecnosci.id_nb = nb.id_nb)inner join nauczyciel on (nieobecnosci.id_nauczyciel = nauczyciel.id_nauczyciel) where uczen.login = '$_SESSION[login_u]' order by nieobecnosci.data asc, nieobecnosci.godzina_lek asc;") or die('Błąd zapytania'); 

			if(mysql_num_rows($wynik) > 0) 
			{
				echo "<table cellpadding=\"2\">";
				echo "<tr>";
		        echo "<td>Data</td>";
				echo "<td>1</td>";
				echo "<td>2</td>";
				echo "<td>3</td>"; 
				echo "<td>4</td>";
				echo "<td>5</td>"; 
				echo "<td>6</td>";
				echo "<td>7</td>";
				echo "<td>8</td>";
		        echo "</tr>";	

		    while($r = mysql_fetch_array($wynik)) 
		    {
				if ($previous != $r[data])
				{
					echo "<tr>";
		 			echo "<td>".$r[data]."</td>";
					$previous = $r[data];
				}

				if ($r[godzina_lek] == 1)
					echo "<td>".$r[nb]."</td>";
				elseif ($r[godzina_lek] == 2)
					echo "<td>".$r[nb]."</td>";
				elseif ($r[godzina_lek] == 3)
					echo "<td>".$r[nb]."</td>";
				elseif ($r[godzina_lek] == 4)
					echo "<td>".$r[nb]."</td>";
				elseif ($r[godzina_lek] == 5)
					echo "<td>".$r[nb]."</td>";
				elseif ($r[godzina_lek] == 6)
					echo "<td>".$r[nb]."</td>";
				elseif ($r[godzina_lek] == 7)
					echo "<td>".$r[nb]."</td>";
				elseif ($r[godzina_lek] == 8)
					echo "<td>".$r[nb]."</td>";
				else 
					echo "<td></td>"; 


		       if ($previous != $r[data])
		        	echo "</tr>";

				$previous = $r[data];
		    }
		    echo "</table>"; 
		}
}

 

Jej wynik można podejrzeć w załączniku.

 

Sęk w tym, że pomimo iż w przypadku drugiej daty wpisanej w bazie (godziny lekcyjne tylko 1 i 8) na stronie wyświetlane jest jako 1 i 2 godzina. Jeżeli zapełnimy cały dzień to wszystko jest ok, jednak przy pojedynczej godzinie system się wali. Jaki można dać w takim razie warunek, który będzie uzupełniał pola niewystępujące w tabeli?

post-283654-13956791756_thumb.png

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

najpierw w php tworzysz sobie tablicy dla jednego dnia dla wszystkich godzin lekcyjnych, a potem po wyciagnięciu z bazy wstawiasz tylko do odpowiedniego indeksu do tablicy i na końcu orbisz echo p kolei tych elementów z tablicy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ta.. ale wpisów może być miliard 10 milionów - to nie bardzo ma zastosowanie praktyczne

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

miliard 10 milionów dni? Chyba do końca nie zrozumiałeś o co chodzi... Nie mówie o robieniu tej tablicy w bazie, tylko w php, tuż przed wyświetleniem danego dnia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jeśli dobrze zrozumiałem kod i while przelatuje godziny od 1-8 to w ostanim else daj echo "<td> </td>";

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jeśli dobrze zrozumiałem kod i while przelatuje godziny od 1-8 to w ostanim else daj echo "<td> </td>";

 

Nie, to tak nie działa. Jeżeli dany dzień ma 8 wpisów (dajmy na to godziny od 1 do 8) to pętla kręci się 8 razy. Jednak jeśli dodamy wpis dla innego dnia (powiedzmy 3 wpisy gdzie lekcje to 5,6,7) to teraz ta pętla wykona się 8 + 3 (11) razy. Nie ma więc możliwości "na sztywno" wpisania <td> </td> bo wartość ifa nigdy nie będzie fałszywa. W tym właśnie tkwi problem. :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hmmm.. z tego co widzę, to chyba przechowujesz w tabeli tylko informacje o nieobecnościach (?)

Jeżeli tak, to możesz zrobić taki myk, że stworzysz zmienną z domyślną wartością = 1 (taka też wartość powinna być ustawiana za każdym razem gdy zmienia się dzień który analizujesz -- np. pierwszy if w pętli while) i będziesz porównywać godzinę wyczytaną z bazy, z tą wartością i jeżeli wartości się będą pokrywać to wypisujesz "<td>".$r[nb]."</td>", w przeciwnym wypadku wypisujesz "<td> </td>" i po zakończeniu instrukcji warunkowej zwiększasz wartość zmiennej o 1.

 

Czyli w zasadzie kod chyba można zmodyfikować do takiej postaci (uwaga możliwy pseudokod, bo nie znam za dobrze php, choć pewno i tak większość przekopiuje..):

while($r = mysql_fetch_array($wynik)) {
   if ($previous != $r[data]) {
       echo "<tr>";
       echo "<td>".$r[data]."</td>";
       $previous = $r[data];

       $current_day = 1;
   }

   if ( $r[godzina_lek] == $current_day )
       echo "<td>".$r[nb]."</td>";
   else echo "<td> </td>";

   $current_day = $current_day + 1;

   //...
}

 

Taka mała uwaga --> powyższe będzie działać tylko wtedy gdy godziny będą w kolejności rosnącej. Co prawda można by było zrobić tak aby działało to zawsze, ale wymagałoby to użycia zapewne dodatkowej 'tablicy' (kontenera) 8 elementowej (zakładając, że mamy do czynienia tylko i wyłącznie z 8 godzinami w danym dniu) z której byłyby usuwane wartości gdy godzina uzyskana z bazy pokrywa się z 'jakąś' wartością znajdującą się w tej tablicy (kontenerze).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak nie będzie działąć, a to dlatego, że pętla obraca się tylko tyle razy ile razy warunek jest prawdziwy. Przykładowo są 3 nieobecności to pętla obróci się tylko 3 razy. Jeżeli tak sprawdzamy dane, to i tak będziemy mieć tylko 3 wyniki, zamiast 8 (zakładając, że jeden dzień to 8 lekcji). Będzie np. pusty, pusty, nieobecność.

 

A co z pozostałymi 2 nieobecnościami?

 

To wygląda mniej więcej tak:

 

Mamu nieobecność na 3, 4, 8 lekcji.

Pętla obraca się tylko 3 razy...

Przy takim założeniu wypisze nam 2 pola puste i 3 nieobecność.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No to..:

1. zmodyfikuj pętlę aby obracała się tyle razy ile jest możliwych w danym dniu nieobecności (+ ewentualna modyfikacja ograniczająca ilość przebiegów gdy np. nieobecności są tylko na pierwszej i 2 godzinie) lub

2. pobierz z bazy dane dotyczące (wartości) maksymalnej godziny na której w danym/analizowanym dniu jest nieobecność i albo:

a) tyle razy obróć pętlę albo

b) zmodyfikuj algorytm tak aby uwzględniał te dane <-- napisane ogólnikowo, bo możliwości zmodyfikowania jest kilka jak np. stworzenie tablicy uzupełnianej nieobecnościami (i ich brakiem) i dopiero później gdy już cała jest uzupełniona, to na podstawie zawartości tablicy uzupełnianie tabelki.

Można by też wymyślić jakieś podglądanie wartości następnej godziny na której była nieobecność (o ile jest to możliwe do zrealizowania w prosty sposób) i jeżeli różnica pomiędzy aktualną godziną, a tą podglądaną byłaby większa od 1, to wtedy dodatkową pętlą dodajesz odpowiednie dane (niełamliwe spacje ;) ) do wyświetlanej tabelki (rzecz jasna pętla przelatywałaby tyle razy ile wynosi wspomniana różnica).

 

Możliwości jest sporo.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...