Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Lista obecności uczniów na przedmiocie w danej szkole
emillo91
post 30.09.2017, 17:00:16
Post #1





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 29.03.2012

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


Witam. Chcę się zapytać jak mogę rozwiązać problem zapisu id uczniów nieobecnych na zajęciach, do tabeli MySQL. Zarys tabeli przedstawia się tak:
CODE
id_listy | id_przedmiot | id_nieobecne | id_klasa | id_szkola | data_listy

Przedstawiona tabela jest tabelą dzienniczka elektronicznego. Mój problem polega na tym że nie wiem czy powinienem zapisywać wszystkie id nieobecnych uczniów do pola o nazwie "id_nieobecne" a następnie rozdzielać to w PHP pętlą. Chodzi mi o coś takiego:
CODE
id_listy | id_przedmiot | id_nieobecne | id_klasa | id_szkola | data_listy
1 | 3 | 1426 | 6 | 8 | 2017-22-03

gdzie 1426 to osobne id uczniów
Baza dzienniczka elektronicznego będzie bazą dla wielu szkół dlatego chcę tworzyć listy obecności w jednej tabeli i później wybierać obecności po id przedmiotu, id klasy oraz id szkoły. Moim zdaniem takie rozwiązanie jest dobre do momentu aż przyjdzie mi rozdzielać te obecności na każdego z uczniów w danej szkole. Będę wdzięczny za każdą pomoc.
Go to the top of the page
+Quote Post
trueblue
post 30.09.2017, 21:14:30
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


A 1426 to id=1426, czy może 14 i 26, a może 1, 4, 2 i 6, a może 142 i 6...?
Odpowiedź mam nadzieję, że sam znajdziesz. Aby tylko to nie było dodawanie przecinków pomiędzy id.

Czy id_szkola i id_klasa są potrzebne jednocześnie w tabeli? Skoro masz id_klasa, to wiesz do jakiej szkoły przynależy.

Datę listy w tym ujęciu zmieniłbym raczej na datę nieobecności.

Ten post edytował trueblue 30.09.2017, 21:38:32


--------------------
Go to the top of the page
+Quote Post
emillo91
post 30.09.2017, 23:27:27
Post #3





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 29.03.2012

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


Rozumiem o co Tobie chodzi. Masz rację że później będzie problem z odróżnieniem czy id nieobecności składa się z jednej czy dwóch cyfr. Zastanawiałem się też żeby rozdzielić te id jakimś separatorem ale skoro ma przechowywać id to pole powinno przechwywać wartości int a nie varchar. Chyba pozostanie mi tylko stworzyć tabelę łącznikową tylko nie wiem jak mogłaby wyglądać. Odnośnie pola id szkola to faktycznie jest zbędne. Jutro będę nad tym myślał
Go to the top of the page
+Quote Post
Pyton_000
post 1.10.2017, 08:30:46
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Co do nieobecności to poszedłbym o krok dalej i zostawił tylo:

ID_ucznia
data_nieobecności
ID_przedmiotu

Tylko te 3 kolumny. Zapewniają one minimalne wymagania aby pobrać odpowiednie dane.
Go to the top of the page
+Quote Post
emillo91
post 1.10.2017, 12:45:10
Post #5





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 29.03.2012

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


Niestety Id_Klasa musi zostać gdyż dane listy obecności dla nauczyciela będą później pobierane przy użyciu sesji z id klasy a id przedmiotu będzie pobierane za pomocą metody GET z pola typu select. Załóżmy że jeden nauczyciel uczy kilka klas z tego samego przedmiotu i jeżeli zostanie pobrane id przedmiotu(który jest kategorią) to zostaną wyświetlone wszystkie listy obecności z przedmiotu np. matematyka, niezależnie od klasy i nauczyciel nie będzie wiedział do której klasy przypisana jest dana lista obecności. Żeby doprecyzować filtrowanie dorzucam do tego zmienną sesyjną z Id_Klasa która wyświetla tylko i wyłącznie listę wybranej klasy z przedmiotu matematyka. Chcę utworzyć sesję klasy ze względu na to że nauczyciel będzie się poruszał pomiędzy zakładkami(tzn. będzie mógł dodawać, usuwać ucznia o ile jest wychowawcą itd nie wybierając za każdym razem klasy w której uczeń jest zapisany). stworzyłem coś takiego:
Lista tabel
Najpierw będzie pobierana lista wszystkich klas których uczy nauczyciel. Następnie zostanie utworzona zmienna sesyjna z id danej klasy natomiast później nauczyciel będzie wybierał istniejącą już listę obecności bądź tworzył nową listę dla klasy ze zmiennej sesyjnej i przedmiotu o id ze zmiennej GET. Taka struktura powinna ułatwić mi później pobieranie nieobecności dla danego ucznia. Co wy na to?
Jeżeli będzie trzeba to podrzucę screeny widoków przyszłej strony które zobrazują o co mi chodzi

Ten post edytował emillo91 1.10.2017, 12:50:44
Go to the top of the page
+Quote Post
trueblue
post 1.10.2017, 14:37:42
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Uczeń należy do jednej klasy, więc jeśli masz id ucznia, to wiesz jakie jest id klasy.


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 1.10.2017, 15:00:01
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


@trueblue tak też załżyłem, ale czytając to co autor napisał to chyba nie koniecznie.
Go to the top of the page
+Quote Post
trueblue
post 1.10.2017, 15:05:07
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Pyton_000,
ja się opieram na tym stwierdzeniu autora "nauczyciel nie będzie wiedział do której klasy przypisana jest dana lista obecności.". Skoro mam id_ucznia w liście obecności, to wiem jaka to klasa.
Ale być może czegoś nie rozumiem, bo przyznam, że opis dla mnie jest chaotyczny.


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 1.10.2017, 15:10:17
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Chociaż trzeba by było wziąć pod uwagę że uczeń należał do klasy 1-4 a teraz jest w 5 smile.gif Ale to się da załatwić podając rok ew. oznaczać klasy jako nie aktywne
Go to the top of the page
+Quote Post
markonix
post 1.10.2017, 20:13:36
Post #10





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

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


Można rozdzielić osobę i ucznia na wyższym poziomie.
Czyli tablica z osobami gdzie będą stałe dane dotyczące osoby (imię, nazwisko, data urodzenia) i potem uczniami (numer w dzienniku, id klasy).
Na taki sam problem trafiłem dawno gdy robiłem bazę pod zawodników, błędnie zacząłem używać user_id i dopiero potem rozdzieliłem to na zawodnika i usera.


--------------------
Go to the top of the page
+Quote Post
emillo91
post 1.10.2017, 20:32:50
Post #11





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 29.03.2012

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


Mi chodzi o sytuację kiedy na konto jest zalogowany nauczyciel. Jak skrypt ma pobrać poprzednie listy obecności danej klasy nie wiedząc którzy uczniowie są przydzieleni do danej klasy?. Odnośnie screenów to chodzi mi o coś takiego:
Na początku nauczyciel wybiera klasę powiedzmy 2Lp (czyli musi ustawić id klasy do zmiennej sesyjnej):
link1
Następnie przechodzi do zakładki "Listy obecności" i tam, po wybraniu przedmiotu matematyka(nauczyciel może uczyć też innych przedmiotów) wyświetla się zbiór list obecności dla klasy 2Lp:
link2
Następnie może utworzyć nową listę obecności dla tej klasy z przedmiotu matematyka bądź wyświetlić już istniejącą listę:
link3

To co piszecie odbieram tak że nauczyciel(nie wychowawca) musiałby wyświetlać zbiór list obecności poprzez sprawdzenie id ucznia a następnie wybranie id klasy. Nie za bardzo rozumiem o co chodzi.
Go to the top of the page
+Quote Post
Pyton_000
post 1.10.2017, 20:53:34
Post #12





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Nie.

Nie ważne kim jesteś. Jeśli wybierasz klasę to masz `id_klasy`. A skoro już wiesz jaką klasę masz to możesz na tej podstawie pobrać listę uczniów. Skoro masz listę uczniów to wybierając datę listy i przedmiot masz gotowe dane


Taki przykład nieobecnosci na podstawie klasy:
Kod
SELECT nieobecnosci.*
FROM klasa
JOIN uczniowie_klasa ON(uczniowie_klasa.klasa_id = klasa.id)
JOIN uczniowie ON(uczniowie.id = uczniowie_klasa.uczen_id)
LEFT JOIN nieobecnosci ON(nieobecnosci.uczen_id = uczen.id)
WHERE id_klasy = 5;


Go to the top of the page
+Quote Post
emillo91
post 2.10.2017, 17:25:25
Post #13





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 29.03.2012

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


Już rozumiem. Chodzi o to żeby pobierać dane o klasie z rekordu zarejestrowanego ucznia. Ja miałem inny zamysł. Chciałem przypisywać ucznia do klasy a nie klasę do ucznia ale nie wiem czy może być jakaś różnica(w sensie działania) między tymi rozwiązaniami(czy będzie więcej joinów dla mojego rozwiązania). Pyton_000 na podstawie Twojego zapytania zrobiłem takie tabele:
link
I teraz mogę sprawdzać warunkiem czy id wybranego ucznia znajduje się w nieobecnościach.
Tylko będę miał jeszcze jeden problem który po tym nastąpi. Jak zliczyć ilość lekcji które się odbyły żeby dla każdej lekcji skrypt sprawdzał czy uczeń był na zajęciach czy nie(np. 7 lekcji to 7 iteracji dla jednego ucznia)?
Chciałem to rozwiązać pobierając wszystkie zapisane listy obecności z tabeli "ListyObecnosci" i wtedy wiedziałbym ile lekcji(na podstawie list obecności) się już odbyło.
Go to the top of the page
+Quote Post
Pilsener
post 5.10.2017, 11:22:02
Post #14





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Punktem wyjścia i sercem modelu powinna być tabela "zajęcia", która zawiera coś w rodzaju:
- datę zajęć
- kto prowadzi (imię/nazwisko)
- relację do listy uczestników/uczniów (oddzielna tabela z jakiś polem typu boolean isPresent i oczywiście imię/nazwisko ucznia)
- dane klasy (np. nazwa XIII B )
- dane przedmiotu (np. pauperyzacja w społeczeństwie)

Do tego panel administracyjny gdzie definiujemy wszystko co niezbędne do zapełnienia tabeli "zajęcia"
- tabelę użytkowników
- tabelę klas
- tabelę przedmiotów
- tabelę uczniów (id użytkownika + id klasy)
- tabelę nauczycieli
- itd.

Trzeba pamiętać o historycznym aspekcie danych.
Można np. zastąpić imię/nazwisko user_id jeśli założymy, że tabela users jest immutable i np. wyrzucenie ucznia ze szkoły nie będzie skutkowało jego usunięciem z tej tabeli. Inaczej ktoś chciałby zobaczyć zajęcia id=1 sprzed roku i mógłby się zdziwić, że np. belfer jest inny Lkingsmiley.png Nauczyciele, rodzaje zajęć, liczba klas - to wszystko zmienia się w czasie i należy to uwzględnić.

Ten post edytował Pilsener 5.10.2017, 11:22:45
Go to the top of the page
+Quote Post
emillo91
post 7.10.2017, 21:33:17
Post #15





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 29.03.2012

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


Odnośnie archiwizacji danych to niektóre rekordy musiałyby być duplikowane w pewnych przypadkach. Jeżeli uczeń zmieniałby klasę to musiałby otrzymywać nowe id a stare zostałoby dla innych tabel ale to wiąże się z redundancją rekordów(bo dane ucznia ze starego rekordu tez muszą zostać zapisane). Ewentualnie można utworzyć tabelę "zmiany_danych" w której uwzględni się stare id ucznia a id dodanego rekordu przypisze się do pozostałych tabel. Jeżeli chodzi o temat listy obecności uczniów to uznam go za rozwiązany. Podany przeze mnie powyżej wzór tabeli spełnia moje wymagania. Jeżeli chodzi o temat archiwizacji to będę kombinował a jeżeli nie będę czegoś wiedział to poproszę o pomoc.
Edit:
Odnośnie archiwizacji danych to natknąłem się na takie coś jak tiggery(wyzwalacze) wink.gif

Ten post edytował emillo91 8.10.2017, 17:44:56
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 Wersja Lo-Fi Aktualny czas: 20.07.2025 - 01:59