Gestione Orario Lezioni: Schema del Database corsi corso studenti studente anno anno docente orario id corso giorno ora1 docenti docente dipartimento email ora2 aula aule aula capienza 1
Gestione Orario Lezioni: corsi CREATE TABLE corsi ( corso VARCHAR(20) NOT NULL, anno TINYINT NOT NULL, docente VARCHAR(10) NOT NULL, PRIMARY KEY (corso) ); corso anno docente analisi 1 rossi chimica 1 bianchi disegno 2 verdi estetica 2 gialli fisica 1 bianchi geometria 1 rossi informatica 2 viola modellazione 2 verdi 2
Gestione Orario Lezioni: docenti CREATE TABLE docenti ( docente VARCHAR(10) NOT NULL, dipartimento VARCHAR(20) NOT NULL, email VARCHAR(40) NOT NULL, PRIMARY KEY (docente) ); docente dipartimento email bianchi scienze bianchi@scienze.unibs.it gialli arte gialli@arte.unibs.it rossi informatica rossi@informatica.unibs.it verdi design verdi@design.unibs.it viola informatica viola@informatica.unibs.it 3
Gestione Orario Lezioni: studenti CREATE TABLE studenti ( studente VARCHAR(10) NOT NULL, anno TINYINT NOT NULL, PRIMARY KEY (studente) ); studente anno anna 1 luigi 2 sofia 3 4
Gestione Orario Lezioni: aule CREATE TABLE aule ( aula VARCHAR(3) NOT NULL, capienza SMALLINT NOT NULL, PRIMARY KEY (aula) ); aula capienza B01 55 B02 50 B03 70 B04 60 N1 100 N2 100 N3 120 N4 120 5
Gestione Orario Lezioni: orario CREATE TABLE orario ( id TINYINT NOT NULL AUTO_INCREMENT, corso VARCHAR(20) NOT NULL, giorno CHAR(3) NOT NULL, ora1 TINYINT NOT NULL, ora2 TINYINT NOT NULL, aula VARCHAR(3) NOT NULL, PRIMARY KEY (id) ); id corso giorno ora1 ora2 aula 1 analisi lun 1 2 N1 2 analisi mer 4 5 N2 3 analisi ven 3 6 N2 4 chimica ven 1 2 N4 5 chimica mar 2 5 N3 6 disegno ven 4 5 B01 7 disegno gio 1 3 B01 8 estetica ven 1 2 B04 9 estetica mer 7 10 B02 10 fisica lun 4 5 N2 11 fisica lun 3 4 N4 12 geometria gio 1 4 N1 13 geometria mar 3 4 N3 14 informatica gio 5 6 N1 15 informatica mer 1 2 N3 16 informatica lun 2 4 N2 17 modellazione mar 3 4 B02 18 modellazione ven 1 2 B03 19 modellazione gio 4 5 B04 6
Menu Principale: index.php Richiede autenticazione 7
Aggiornamento Database 8
Aggiornamento Corsi 9
Aggiornamento Studenti 10
Aggiornamento Docenti 11
Aggiornamento Aule 12
Aggiornamento Orario 13
Visualizzazione Orario 14
Orario Corso 15
Orario Studente 16
Orario Docente 17
Orario Aula 18
Orario Generale 19
Sovrapposizioni 20
Sovrapposizioni Corsi Link all orario del corso 21
Sovrapposizioni Corsi (ii) Sovrapposizione 22
Sovrapposizioni Studenti Link all orario dello studente 23
Sovrapposizioni Docenti Link all orario del docente 24
Sovrapposizioni Aule Link all orario dell aula 25
Ricerca Aule Libere Ordine discendente Ordine ascendente Link all orario dell aula 26
Script aggiornamenti.php require('funzioni.php'); autenticazione('universita'); $corpo = ul(li(hlink('aggiorna_corsi.php', 'Aggiornamento Corsi')). li(hlink('aggiorna_studenti.php', 'Aggiornamento Studenti')). li(hlink('aggiorna_docenti.php', 'Aggiornamento Docenti)). li(hlink('aggiorna_aule.php', 'Aggiornamento Aule')). li(hlink('aggiorna_orario.php', 'Aggiornamento Orario'))); echo xhtml('aggiornamento del Database', $corpo.home()); function autenticazione($realm, $username='admin', $password='design') { if(!isset($_server['php_auth_user'])!isset($_server['php_auth_pw']) $_SERVER['PHP_AUTH_USER']!= $username $_SERVER['PHP_AUTH_PW']!= $password) { header('http/1.1 401 Unauthorized'); header('www-authenticate: Basic realm="'.$realm.'"'); exit(h('introdurre username e password per accedere a questa pagina!', 2).home()); Eseguita nel caso di selezione del pulsante "Cancel" 27
Autenticazione Browser HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm="universita" Server 28
require('funzioni.php'); autenticazione('universita'); $db = connect(); Script aggiorna_corsi.php if(isset($_post['new'])) Caso di inserimento (submit del form) { extract($_post); // $corso, $anno, $docente if(empty($corso)) echo errore('inserire il nome del corso'); else { $sql = "INSERT INTO corsi VALUES ('$corso', '$anno', '$docente')"; modify($db, $sql); elseif(isset($_get['corso'])) Caso di cancellazione [X] { $corso = $_GET['corso']; $sql = "DELETE FROM corsi WHERE corso = '$corso'"; modify($db, $sql); $corpo = tr(th('corso').th('anno').th('docente').th('cancella')); Visualizzazione della tabella $sql = "SELECT * FROM corsi ORDER BY corso"; query($db, $sql, $res); while($tupla = fetch($res)) { extract($tupla); // $corso, $anno, $docente $corpo.= tr(td($corso).td($anno).td($docente).td(qlink("aggiorna_corsi.php?corso=$corso", "X"))); $menu_anni = xhtml_menu(range(1,3), 'anno'); $menu_docenti = xhtml_menu(sql_array($db, 'SELECT docente FROM docenti ORDER BY docente'), 'docente'); $corpo.= tr(td(textinput('corso', 20)).td($menu_anni).td($menu_docenti). td(submit('new', 'Inserisci!'))); echo xhtml('aggiornamento Corsi', form('aggiorna_corsi.php', table($corpo).home())); disconnect($db); 29
Funzioni Ausiliarie Generazione di un array enumerativo risultante da una query SQL: function sql_array($db, $sql) { if(query($db, $sql, $res) == 0){ errore('non ci sono tuple'); exit; $a = array(); $tupla = mysqli_fetch_row($res); if(count($tupla) > 1){ errore('numero di campi maggiore di 1'); exit; $a[] = $tupla[0]; while($tupla = mysqli_fetch_row($res)) $a[] = $tupla[0]; return $a; Generazione di un menu XHTML relativo ad un array enumerativo: function xhtml_menu($a, $name) { $xhtml = ''; foreach($a as $opzione) $xhtml.= option($opzione); return select($xhtml, $name); 30
require('funzioni.php'); Script orario_settimanale.php if(isset($_post['submit'])) Caso di sottomissione del form { extract($_post); // $settimanale, $corso, $studente, $docente, $aula if($settimanale == 'c') call("orario_corso.php?corso=$corso"); elseif($settimanale == 's') call("orario_studente.php?studente=$studente"); elseif($settimanale == 'd') call("orario_docente.php?docente=$docente"); elseif($settimanale == 'a') call("orario_aula.php?aula=$aula"); else Caso di visualizzazione del form call('orario_generale.php'); $db = connect(); $menu_corsi = xhtml_menu(sql_array($db, 'SELECT corso FROM corsi ORDER BY corso'), 'corso'); $menu_studenti = xhtml_menu(sql_array($db, 'SELECT studente FROM studenti ORDER BY studente'), 'studente'); $menu_docenti = xhtml_menu(sql_array($db, 'SELECT docente FROM docenti ORDER BY docente'), 'docente'); $menu_aule = xhtml_menu(sql_array($db, 'SELECT aula FROM aule ORDER BY aula'), 'aula'); $xhtml = table(tr(th('corso').td(radioinput('settimanale', 'c')).td($menu_corsi)). tr(th('studente').td(radioinput('settimanale', 's')).td($menu_studenti)). tr(th('docente').td(radioinput('settimanale', 'd')).td($menu_docenti)). tr(th('aula').td(radioinput('settimanale', 'a')).td($menu_aule)). tr(th('generale').td(radioinput('settimanale', 'g', TRUE)).td(submit('submit','Invia')))); echo xhtml('orario Settimanale', form('orario_settimanale.php', $xhtml.home())); 31
Script orario_corso.php require('funzioni_univ.php'); $db = connect(); $corso = $_GET['corso']; $sql = "SELECT * FROM orario WHERE corso = '$corso'"; $num = query($db, $sql, $res); if($num == 0) { messaggio("il corso '$corso' non ha lezioni"); echo qlink("orario_settimanale.php", "Continua"); else { $tabella = settimana(); while($tupla = fetch($res)) { extract($tupla); // $corso, $giorno, $ora1, $ora2, $aula for($ora = $ora1; $ora <= $ora2; $ora++) $tabella[$ora-1][$giorno].= ($tabella[$ora-1][$giorno]? br().$aula : $aula); $orario_corso = tabella_settimanale($tabella); echo xhtml("orario del corso '$corso'", $orario_corso.home()); disconnect($db); 0 1 2 3 4 5 6 7 8 9 lun mar mer gio ven array settimana(): tabella (vuota) dell orario settimanale (array bidimensionale) string tabella_settimanale(array tabella): tabella XHTML di tabella 32
Script funzioni_univ.php <?php require('funzioni.php'); function settimana() { $tabella = array(); for($ora = 1; $ora <= 10; $ora++) $tabella[$ora-1] = array('lun'=>'', 'mar'=>'', 'mer'=>'', 'gio'=>'', 'ven'=>''); return $tabella; function tabella_settimanale($tabella) { $corpo = tr(td(br(),'white'). th('lunedì'). th('martedì'). th('mercoledì'). th('giovedì'). th('venerdì')); for($ora=1; $ora <= 10; $ora++) $corpo.= tr(th($ora). td($tabella[$ora-1]['lun']? $tabella[$ora-1]['lun'] : br()). td($tabella[$ora-1]['mar']? $tabella[$ora-1]['mar'] : br()). td($tabella[$ora-1]['mer']? $tabella[$ora-1]['mer'] : br()). td($tabella[$ora-1]['gio']? $tabella[$ora-1]['gio'] : br()). td($tabella[$ora-1]['ven']? $tabella[$ora-1]['ven'] : br())); 0 1 2 3 4 5 6 7 8 9 lun mar mer gio ven return table($corpo); 33
Script sovrapposizioni_corsi.php require('funzioni_univ.php'); $db = connect(); $sql = "SELECT * FROM corsi"; query($db, $sql, $res); $sovcorsi = tr(th('corso')); $num_corsi_con_sov = 0; while($tupla = fetch($res)){ $corso = $tupla['corso']; $sql_lezioni = "SELECT giorno, ora1, ora2 FROM orario WHERE corso = '$corso'"; query($db, $sql_lezioni, $res_lezioni); $tabella = settimana(); $ok = TRUE; while($ok && ($lezione = fetch($res_lezioni))){ extract($lezione); // $giorno, $ora1, $ora2 for($ora = $ora1; $ora <= $ora2 && $ok; $ora++){ if($tabella[$ora-1][$giorno]) $ok = FALSE; else $tabella[$ora-1][$giorno] = TRUE; if(!$ok){ $sovcorsi.= tr(td(hlink("orario_corso.php?corso=$corso", $corso))); $num_corsi_con_sov++; if($num_corsi_con_sov == 0){ messaggio("non ci sono sovrapposizioni di lezioni per i singoli corsi"); echo qlink("sovrapposizioni.php", "Continua"); else echo xhtml('corsi con lezioni sovrapposte', table($sovcorsi).home()); disconnect($db); 0 1 2 3 4 5 6 7 8 9 lun mar mer gio ven 34
Esercizio Completare l applicazione di gestione orario delle lezioni codificando i seguenti script: aggiorna_studenti.php aggiorna_docenti.php aggiorna_aule.php aggiorna_orario.php orario_studente.php orario_docente.php orario_aula.php orario_generale.php sovrapposizioni_studenti.php sovrapposizioni_docenti.php sovrapposizioni_aule.php aule_libere.php 35