Pomoc w stworzeniu struktury baz danych (projekt dzienniczka szkolnego)

0

Witam!!
Prosiłbym o udzielenie mi paru wskazówek odnośnie mojego projektu. Mam do zrobienie projekt Elektroniczny Dziennik Szkolny w oparciu o HTML/XHTML, PHP i jakaś baza danych(MYSQL, SQL itp.). Na początek wystarczy jedna klasa i 2 konta: nauczycielskie i rodzicielskie.
Na początek wziąłem sie za tworzenie bazy danych. Obrałem jakby 2 ścieżki przy tworzeniu tej bazy: ogólna z informacjami o uczniach, nauczycielach, opiekunach itp, następnie wziąłem sie za opracowywanie całego systemu zarządzająćego. Pod uwagę wziąłem również fakt premiowania uczniów do następnej klasy.
Mam pare pytań:

  • zamierzam tą bazę utworzyć w PHPMYADMIN bo w tym pracowałem i coś już wiem, czy to dobry pomysł??, jeżeli tak to jaki silnik bazodanowy najlepiej wybrać??,
  • jak rozwiązać opcję logowania, czy w bazie danych utworzyć odpowiednie tabele, chciałbym ażeby po każdym logowaniu wyskakiwał licznik logowań lub jak kto woli liczbę wejść na swoje konto, ale to już chyba w PHP?.
  • z czasem myślę utworzyć konto dyrektorskie, gdzie dyrektor będzie mógł wprowadzać rodziców i uczniów, generować im hasła i loginy.Tu mam pytanie jak technicznie rozwiązać ten problem, tzn. jeżeli dyrektor wprowadzi jakiegoś ucznia i opiekuna, to po zapisaniu danych baza danych automatycznie łączyła rodzica z uczniem, tzn. przy zalogowaniu rodzica będą wyświetlane dane dotyczące tego ucznia.
  • kolejny wielki problem jaki napotkałem, to jak zrobić system szybkiego wpisywania ocen, otóż zakładając że 1 uczeń ma 15 przedmiotów, a w klasie jest 30 uczniów to powoduje, że użytkownik musi zrobić 450 wpisów do tabeli (nauczyciel skończyłby żywot:)). Zastanawiam się,nad stworzeniem 2 tabel ramowka i ramowka_sklad gdzie będzie umieszczony zdefiniowany rozkład predmiotów, co wy na to??

Chciałbym nadmienić, że w tworzeniu baz danych nie ma dużego doświadczenia, proszę więc o wyrozumiałość. Pod spodem umieszczem szkic mojej bazy danych.

Za każde wskazówki, porady bądź pomoc w utworzeniu takiej bazy serdeczne wielkie dzięki.

BAZA DANYCH

Tabele z informacjami ogólnymi o uczniach, rodzicach/opiekunach, dyrekcji,

Uczen
Id
imie
nazwisko
plec
data_urodzenia i miejsce_urodzenia
nr_legitymacji
pesel

Opiekunowie
Id
imie
nazwisko
status prawny
e_mail
telefon_kontaktowy

Nauczyciele
Id
imie
nazwisko
plec
tytul_naukowy
data_urodzenia
miejsce_urodzenia
telefon_kontaktowy
e_mail
pesel

Dyrekcja(
Id
imie
nazwisko
plec
tytul_naukowy
funkcja
data_urodzenia
miejsce_urodzenia
telefon_kontaktowy
e_mail
pesel

Wychowawcy
Id
Id_nauczyciela
klasa

SYSTEM ZARZĄDZANIA

  1. Tabela [historia], (id PK, lp PK, rok_immatr, rok_szkolny, semestr_w_roku, semestr_kolejny, rok_nauki) gdzie chcę prowadzić historie danego ucznia (kazdy wpis odpowiada kolejnemu semestrowi nauki). Raz na pol roku (tak jak ida semestry) dokonujemy potem promocji ucznia na nastepny semestr. To pomoze np. sprawdzac czy uczen w danym semestrze ma wszystko zaliczone. Myślę tutaj takze dodac rok immatrykulacyjny ktory pozwoli zidentyfikowac proces dydaktyczny w danym cyklu nauki (rozroznianie powtarzajacych rok).
    Tutaj mozna tez wprowadzic statusy na jakich jest uczen (OK, Trwa rozliczanie, Powtarzanie, itp.)

  2. Tabela [przedmiot] gdzie przechowujemy informacje o tym jakie przedmioty na danym semestrze ma dany uczen. W tym miejscu zapisujemy rowniez koncowa ocene z danego przedmiotu.

  3. Tabela [przedmiot_czastkowe] w ktorej to przechowujemy eventy przeprowadzane w ciagu roku (testy, sprawdziany, kartowki, odpytania, itp.). Pamietane dla ucznia, przedmiotu

  4. Tabela [historia_zachowanie] powiazana scisle z [historia] gdzie wpisujemy informacje o okresowej ocenie postepow studenta

  5. Tabela [przedmiot_zachowanie] w ktorej prowadzacy przedmiot moze wystawic opinie, spostrzerzenia, uwagi, itp.

Następnie wziałem się za klasy:

Wiedząc, że klasy w szkole to nic innego jak grupa uczniow stworzona dla potrzeb przeprowadzania zajec.
Myślę wiec stworzyc tabele [grupy] oraz [grupy_sklad] w ktorej beda trzymane sklady grup. Teraz klasa specjalna (np mat-fiz) to nic innego jak specjalna grupa tak wiec chcę dodac to tego tabele [grupa_cechy] w ktorej beda przechowywane informacje o tym jaka to jest klasa (cechy do grup). Jezeli chodzi o grupy to wydaję mi się, że powinny być z kluczem (rok_immatr) poniewaz grupa funkcjonuje tak dlugo jak uczniowie sie ucza (np gminazjum 3 lata) ale pamietac trzeba ze klasa 1A wystepuje co roku czyli po 2 latach mamy klasy 1A(2008) oraz 1A(2009) gdzie data jest rokiem kiedy uczniowie przyszli do szkoly.
Kazda klasa ma wychowawce (opiekun) co nasowa zrobienie slownika [wykladowcy] i przypisywania go bezposrednio do grupy, posrednio do ucznia.

0

Na początek, to musisz rozróżnić dwie sprawy: schemat bazy danych i interfejs do jego obsługi.
Pytasz jaką bazę użyć, ale wspominasz że chciałbyć to robić w phpMyAdmin. A wiesz, że on obsługuje tylko jeden rodzaj bazy - MySQL? Swoją drogą nie jest to narzędzie jakieś super - raczej przeciętne.
Uwagi co do bazy (co do interfejsu nie będę się wypowiadał):

  • pewne dane są zbędne - po co data i miejsce urodzenia nauczyciela?
  • dyrekcja nie jest wieczna - wybierana (mianowana) jest na jakiś okres - brak dat od do;
  • dyrektor zazwyczaj jest również nauczycielem, czy więc musisz te dane dublować?
  • potrzebna ci jest dodatkowa tabela, w której będziesz przechowywał id_opiekuna, id_ucznia i okres, w którym ta opieka prawna jest sprawowana (dla np. rodziny zastępczej);
  • nie wiem, co masz na myśli z ramówką...
  • klasy jako grupy masz zrobione fatalnie. jakoś tak zagmatwane, że nic nie kumam;
  • potrzebujesz tabelę z przedmiotami (matematyka, fizyka, itp.), tabelę z godzinami lekcji w poszczególnych dniach oraz z planem lekcji dla każdej z klas;
  • czym się różni zachowanie od innego przedmiotu, że chcesz je w specjalny sposób wyróżnić...
  • po co rok_immatr w tabeli historia? Po co w ogóle chcesz rozróżniać repetantów?

to tyle na szybko...

pozdrawiaMM

0

To może coś zaproponować?? W jaki sposób rozwiązać kwestię promocji do następnej klasy?? albo "masowego" wprowadzania ocen?? To w jakim programie bądź języku twoim zdaniem tą bazę by było napisać??

0

Z punktu widzenia baz danych promocja cię nie interesuje - masz inne informacje: oceny końcowe, klasę, do której dany uczeń chodził w zeszłym roku i w tym.
Mówiłem, że co do interfejsu się nie będę wypowiadał, bo to kwestia indywidualna. Podobnie zresztą jak użyty język i baza danych.
JA bym napisał w:

  • PHP + MySQL jeśli aplikacja WEBowa
  • C# + MS SQL Server (dowolna wersja) jeśli WinForms
    Ale dlatego, że te języki znam dobrze...
0

Witam ponownie. Otóż chciałbym do swojego projektu użyć mechanizmu sesji, która jest opisana na stronie: http://webcity.pl/webcity/wlasny_mechanizm_sesji_w_php. Spróbowałem wykonać to tak jak jest tam podane, pliki umieściłem w xampp jak i baza danych zrobiono jest w phpmyadmin. Przy próbie odpalenia wywala mi błąd :

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in C:\xampp\htdocs\PROJEKT\sessions.php on line 59

Oto jak u mnie wygląda ten skrypt:

plik sessions.php

 <?php

   define('SESSION_TIME', 3600);

   define('WEBBOT_S', 0);
   define('GUEST_S', 1);
   define('USER_S', 2);

   define('ANONYMOUS', 0);

   class session{
      var $session_id;
      var $session_user;
      var $session_ip;
      var $session_browser;
      var $session_time;

      var $sql_id;
      var $ip;
      var $browser;
      var $type;

      var $userdata;
         
          function spy_guest(){
         if(getenv('HTTP_X_FORWARDED_FOR') != ''){
            $this -> ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : ((!empty($_ENV['REMOTE_ADDR'])) ? $_ENV['REMOTE_ADDR'] : $REMOTE_ADDR );

            if(preg_match("/^([0-9]+.[0-9]+.[0-9]+.[0-9]+)/", getenv('HTTP_X_FORWARDED_FOR'), $ip_list)){
               $private_ip = array('/^0./', '/^127.0.0.1/', '/^192.168..*/', '/^172.16..*/', '/^10..*/', '/^224..*/', '/^240..*/');
               $this -> ip = preg_replace($private_ip, $this -> ip, $ip_list[1]);
            }
         }else{
            $this -> ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : ((!empty($_ENV['REMOTE_ADDR'])) ? $_ENV['REMOTE_ADDR'] : $REMOTE_ADDR );
         }

         $this -> browser = (!empty($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : $_ENV['HTTP_USER_AGENT'];

         if(preg_match('/(lycos|googlebot|slurp@inktomi|ask jeeves|whatuseek|ia_archiver)/i', $this -> browser)){
            $this -> type = WEBBOT_S;
         }else{
            $this -> type = GUEST_S;
         }
      } // end spy_guest(); 
         
            function is_session(){
         if(strlen($_COOKIE['my_session_id']) == 32){
            $this -> session_id = $_COOKIE['my_session_id'];
            setcookie('my_session_id', $this->session_id, time() + SESSION_TIME);
            $this -> sql_id = mysql_real_escape_string($this->session_id);
            return 1;
         }
         return 0;
      } // end is_session(); 
         
          function load_session(){
         $r = mysql_query('SELECT s.*, u.*
                  FROM sessions s LEFT JOIN users u ON (s.session_user <> 0 AND s.session_user = u.user_id)
        WHERE s.session_id = ''.$this -> sql_id.'' AND s.session_time > '.(time() - 3600));     TEGO SIĘ CZEPIA 59 LINIJKA, CZEMU??
            $this -> session_id = $row[0];[/color]
            $this -> session_user = $row[1];
            $this -> session_ip = $row[2];
            $this -> session_browser = $row[3];
            $this -> session_time = $row[4];

            if($this -> session_user != ANONYMOUS){
               $this -> type = USER_S;
               $this -> userdata['ID'] = $row[5];
               $this -> userdata['NAME'] = $row[6];
            }else{
               $this -> type = GUEST_S;
            }

            if($this -> session_browser == $this -> browser && $this -> session_ip == $this -> ip){
               mysql_query('UPDATE sessions SET session_time = ''.time().'' WHERE session_id = ''.$this->sql_id.''');
               return 1;
            }
         }
         $this -> type = GUEST_S;
         return 0;
      } // end load_session(); 
         
         function delete_session(){
         mysql_query('DELETE FROM sessions WHERE session_id=''.$this->sql_id.''');
         setcookie('my_session_id', '', 0);
      } // end delete_session(); 
         
          function bot_session(){
         $this -> session_id = '';
         $this -> session_user = 0;
         $this -> session_ip = $this -> ip;
         $this -> session_browser = $this -> browser;
         $this -> session_time = 0;
         $this -> userdata = array('ID' => 0, 'NAME' => '');
      } // end bot_session();

      function guest_session(){
         $this -> session_id = md5(uniqid($this->ip.time()));
         $this -> session_user = 0;
         $this -> session_ip = $this -> ip;
         $this -> session_browser = $this -> browser;
         $this -> type = GUEST_S;
         setcookie('my_session_id', $this->session_id, time()+SESSION_TIME);
         mysql_query('INSERT INTO sessions VALUES(''.$this->session_id.'', '0', ''.$this->ip.'', ''.mysql_real_escape_string($this->browser).'', ''.time().'')');
      } // end guest_session();
         
            function user_session(){
         $this -> garbage_collector();

         $r = mysql_query('SELECT user_id FROM users WHERE user_name = ''.mysql_real_escape_string($_POST['login']).'' and user_password = ''.md5($_POST['password']).''');
         if($id = mysql_fetch_row($r)){
            if(strlen($this->session_id) == 32){
               mysql_query('UPDATE sessions SET session_user = '.$id[0].', session_time = ''.time().'' WHERE session_id = ''.$this->session_id.''');
               if(mysql_affected_rows() == 1){
                  setcookie('my_session_id', $this->session_id, time()+SESSION_TIME);
               }
            }else{
               $this -> session_id = md5(uniqid($this->ip.time()));
               setcookie('my_session_id', $this->session_id, time()+SESSION_TIME);
               mysql_query('INSERT INTO sessions VALUES(''.$this->session_id.'', ''.$id[0].'', ''.$this->ip.'', ''.mysql_real_escape_string($this->browser).'', ''.time().'')');
            }
            return 1;
         }
         return 0;
      } // end user_session(); 
         
           function garbage_collector(){
            UPDATE users, sessions SET user_lastvisit = sessions.session_time WHERE sessions.session_time < '.(time() - SESSION_TIME) 
         mysql_query('DELETE FROM sessions WHERE session_time < '.(time() - SESSION_TIME));
      } // end garbage_collector();
   }
   ?>

plik auth.php (autoryzacja) rozbudowana o boot

   function do_auth(){
      global $session;
      if($_GET['auth'] == 'login'){
         if(!$session -> user_session()){
            error('Nieprawidłowy login i/lub hasło');
            die();
         }else{
            header('Location: index.php');
            die();
         }
      }
   } // end do_auth()
	 
	 $session = new session;
   $session -> spy_guest();
   
   if($session -> type == WEBBOT_S){
      if(defined('LOGIN_REQUIRED')){
         die('Access denied');
      }
      $session -> bot_session();
			
			 }elseif($session -> is_session()){   
      if($session -> load_session()){
         do_auth();
 
         if(defined('LOGIN_REQUIRED')){
            if($session -> type != USER_S){
               form_request();
               die();
            }
         }
 
         if($_GET['auth'] == 'logout'){
            $session -> delete_session();
            $session -> guest_session();
            header('Location: index.php');
						
         }
				 
				    }else{
         $session -> session_id = '';
         do_auth();
 
         if(defined('LOGIN_REQUIRED')){
            form_request();
            die();
         }
         $session -> guest_session();
      }
			
			    do_auth();
      
      if(defined('LOGIN_REQUIRED')){
         form_request();
         die();
      }
      $session -> guest_session();
   }
?> 

functions.php

 <?php
 
   function form_request(){
echo <<<EOF
<html>
<head>
<title>Zaloguj się</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
 
<body>
<center>Zaloguj się</center>
<form method="post" action="index.php?auth=login">
Twój login: <input type="text" name="login"/><br/>
Twoje hasło: <input type="text" name="password"/><br/>
<input type="submit" value="Loguj!"/>
</form>
</body>
</html>
EOF;
   } // end form_request();
   
   function error($komunikat){
echo <<<EOF
<html>
<head>
<title>Bł&#177;d autoryzacji</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
 
<body>
<center>Bł&#177;d</center>
Podczas autoryzacji wyst&#177;pił bł&#177;d: {$komunikat}
</body>
</html>
EOF;
   } // end error();
 
   function db_connect(){
      mysql_connect('localhost', 'pxxxk', 'zxxxx');
      mysql_select_db('school_journal');
   } // end db_connect();
 
   function print_header(){
      global $session;
      if($session -> type == GUEST_S){
         echo 'Witaj, go&#182;ciu<br/>';
      }else{
         echo 'Witaj, jeste&#182; zalogowany jako '.$session -> userdata['NAME'].' (<a href="index.php?auth=logout">Wyloguj</a>)<br/>';
      }
   } // end print_header();
 
   function db_close(){
      mysql_close();
   } // end db_close();
 
?>

index.php

<?php
   require('functions.php');
   
   db_connect();
   
   require('sessions.php');
   require('auth.php');
   
   print_header();
 
   db_close();
?>
Witaj w INDEX
<ul>
   <li><a href="s1.php">Strona 1</a></li>
   <li><a href="s2.php">Strona 2</a></li>
   <li><a href="s3.php">Strona 3 (wymaga autoryzacji)</a></li>
   <li><a href="s4.php">Strona 4 (wymaga autoryzacji)</a></li>
</ul> 

Potem wiadomo strony po i przed logowaniem. Myślę, że tam nie problemu. Czy ktoś może mi powiedzieć co to za błąd i jak go rozwiązać??? Będe bardzo wdzięczny za udzieloną pomoc.

Umieszczam jeszcze tabele bazy danych.

 CREATE TABLE IF NOT EXISTS `sessions` (
  `session_id` int(32) NOT NULL AUTO_INCREMENT,
  `session_user` int(8) NOT NULL,
  `session_ip` varchar(15) NOT NULL,
  `session_browser` varchar(128) NOT NULL,
  `session_time` int(11) NOT NULL,
  PRIMARY KEY (`session_id`)
) ENGINE=MEMORY DEFAULT CHARSET=latin2 AUTO_INCREMENT=1 ;
 CREATE TABLE IF NOT EXISTS `users` (
  `users_id` int(10) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(32) NOT NULL,
  `user_password` varchar(32) NOT NULL,
  `user_last_vist` varchar(128) NOT NULL,
  PRIMARY KEY (`users_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=1 ;
0
WHERE s.session_id = "'.$this -> sql_id.'" AND s.session_time > '.(time() - 3600)); 
0
Marcin.Miga napisał(a)
WHERE s.session_id = "'.$this -> sql_id.'" AND s.session_time > '.(time() - 3600)); 

Przeszło, ale wywala dalej błedy, teraz linijka

Jestem obecnie na stronie
http://pl2.php.net/manual/pl/function.mysql-query.php
Czytam i poprawiam ten skrypt, ale nie mogę sobie poradzić z jedną linijką,czy ktoś może mi choć trochę wyjaśnić, nie bardzo kumam, proszę o wyrozumiałość, dopiero od niedawana wziąłem się za poskaramianie php :

wywala błąd składni

Parse error: syntax error, unexpected '"' in C:\xampp\htdocs\PROJEKT\sessions.php on line 107

  mysql_query('INSERT INTO sessions VALUES('".$this->session_id.", '0' , ".$this->ip.", ".mysql_real_escape_string($this->browser).", ".time()."')');
 
0
mysql_query('INSERT sessions(session_user,session_ip,session_browser,session_time) VALUES("0","'.$this->ip'","'.mysql_real_escape_string($this->browser).'",now()) ')
0
Marcin.Miga napisał(a)
mysql_query('INSERT sessions(session_user,session_ip,session_browser,session_time) VALUES("0","'.$this->ip'","'.mysql_real_escape_string($this->browser).'",now()) ')

Z tym sobie już poradziłem, wklejam ci moją wersję, może być tak??

 mysql_query('INSERT INTO sessions VALUES(\''.$this->session_id.'\', \''.$id[0].'\', \''.$this->ip.'\', \''.mysql_real_escape_string($this->browser).'\', \''.time().'\')'); 
0

Ale żeś namieszał slashami... I po co wstawiasz id, które jest autoincrement?

0
Filus napisał(a)
Marcin.Miga napisał(a)
mysql_query('INSERT sessions(session_user,session_ip,session_browser,session_time) VALUES("0","'.$this->ip'","'.mysql_real_escape_string($this->browser).'",now()) ')

Z tym sobie już poradziłem, wklejam ci moją wersję, może być tak??

 mysql_query('INSERT INTO sessions VALUES(\''.$this->session_id.'\', \''.$id[0].'\', \''.$this->ip.'\', \''.mysql_real_escape_string($this->browser).'\', \''.time().'\')'); 

Wiesz, próbowałem to rozwiązać na podstawie strony http://pl2.php.net/manual/pl/function.mysql-real-escape-string.php . Nie bardzo mogę to pojąć, może dlatego, że od nie dawna tym się zajmuje.

To jest fragment z tej strony co lik podałem wyżej:

string mysql_real_escape_string ( string $łańcuch_bez_znaków_unikowych [, resource $identyfikator_połączeniar ] )
Dodaje znaki unikowe do łańcucha_bez_znaków_unikowych, mając na uwadze aktualnie używany w połączeniu zestaw znaków by tak przygotowanego łańcucha można bezpiecznie użyc w funkcji mysql_query(). Jeśli dopisywane dane mają postać binarną wymagane jest użycie tej funkcji.

Dlatego pojechałem z tymi backslashami. Może mi wyjaśnić: czy obie formy są poprawne?

mysql_real_escape_string() wywołuje funkcję biblioteki MySQL mysql_real_escape_string, która dodaje lewe ukośniki (backslash) do następujących znaków: \x00, \n, \r, , ', " and \x1a.

Użycie tej funkcji jest wymagane zawsze (poza kilkoma wyjątkami) przed wysłaniem zapytania do bazy danych aby zabezpieczyć dane.

Dlatego pojechałem z tymi backslashami. Może mi wyjaśnić: czy obie formy są poprawne?

Bo przepisałem twoją wersję kodu i wywala znajomy komunikat błędu:)

0

Teraz zobaczyłem, że w moim kodzie jest błąd. Brakuje kropki po "->ip". Jak ją dodasz, to nie ma ch.. na Mariolę - musi banglać. Co do mysql_real... masz rację - też to zastosowałem. A mój kod jest czytelniejszy przez zamienne stosowanie w PHP i MySQL " i ' (pojedynczego apostrofu i podwójnego cudzysłowy).

1 użytkowników online, w tym zalogowanych: 0, gości: 1