Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Concetti di base:
Nella realizzazione del programma sono stati utilizzati sostanzialmente quattro linguaggi ognuno deputato ad una diversa funzione: HTML per la struttura delle pagine Javascript per la programmazione lato Client PHP per la programmazione lato Server MySQL per la gestione del Database contenente i dati sui controlli Prima di analizzare con maggiore dettaglio il funzionamento del programma bene spiegare come operano PHP e Javascript. PHP (il nome un acronimo ricorsivo che sta per PHP: Hypertext Preprocessor) viene definito come linguaggio di scripting ed stato inizialmente concepito per la costruzione di pagine HTML dinamiche. In realt non detto che fornisca un output HTML quindi possiamo vederlo come un linguaggio di programmazione lato server. Le pagine PHP sono caratterizzate dall'avere estensione .php e, al loro interno, il codice PHP (che pu essere annidato all'interno di codice HTML o Javascript) viene racchiuso all'interno dei tag <? codice PHP ?> o anche <?php codice PHP ?>. Ogni volta che al Server viene richiesta una pagina con estensione PHP, prima di inviarla al Client, questa viene aperta dall'interprete PHP alla ricerca dei tag definiti prima e il codice da questi delimitato viene valutato e poi, se richiesto, genera output HTML. L'HTML pu essere generato direttamente tramite l'istruzione echo html o indirettamente dalle funzioni richiamate se queste generano errore. Il codice PHP non visibile al Client: aprendo il sorgente di una di queste pagine attraverso il Browser quello che viene visualizzato solo il codice HTML della pagina php, se presente. La sintassi del PHP del tutto simile a quella di Java e Javascript, l'unico accorgimento che le variabili devono necessariamente iniziare tutte col dollaro ($). In pi queste non hanno tipo: una stringa contenente un numero pu tranquillamente essere utilizzata come un numero. Uno dei linguaggi con cui PHP pu interfacciarsi il MySQL utilizzato per gestire il Database dei Controlli. La sintassi la stessa di Microsoft SQL, solo che MySQL open source. Ogni volta che uno script PHP necessita di eseguire delle operazioni sul Database deve chiedere al Web Server di connettersi al Server MySQL specificando il proprietario del processo Server, il nome e la password dell'utente che si vuole connettere a MySQL. Generalmente infatti questo DBMS (DataBase Management System) possiede un insieme di utenti (definiti dall'amministratore del Server) con permessi diversi sugli archivi. Tuttavia questi parametri vengono inseriti in fase di sviluppo e non riguardano quindi l'utente finale. La funzione per connettersi a MySQL mysql_connect(localhost,utente_mysql,psw_mysql) e restituisce una connessione,
quindi all'interno del codice questa funzione si presenta come: $conn=mysql_connect(localhost,utente_mysql,psw_mysql); Da notare che, come per tantissimi altri linguaggi di programmazione, ogni istruzione termina con il punto e virgola. Una volta definita la connessione bisogna selezionare il database da utilizzare con quella connessione attaraverso la funzione mysql_select_db che non restituisce nulla. Chiamandosi Controlli il Database su cui opera il programma, la funzione all'interno del codice viene cos utlizzata: mysql_select_db(Controlli,$conn); A questo punto possibile eseguire le query sul database attaverso la funzione mysql_query. Supponendo che all'interno della variabile $query ci sia la nostra interrogazione, la funzione prende questa forma: $ris=mysql_query($query,$conn); nella variabile $ris viene introdotto il risultato della query o false se la query non riuscita. Si pu anche indicare un messaggio da fornire all'utente (attraverso l'HTML) nel caso in cui la query non riuscisse per qualche motivo. $ris=mysql_query($query,$conn)ordie(Querynonriuscita); cos, oltre ad avere false in $ris, l'utente viene anche avvisato del problema. Effettuate tutte le operazioni sul DataBase la connessione deve essere chiusa: mysql_close($conn); L'introduzione di Javascript all'interno del programma dovuta solo ad un fatto di ottimizzazione, si scelto cio di interpellare il Server solo nel momento in cui i dati risultano accettabili e possono essere scritti sul DataBase essendo questo l'unico motivo per il quale l'applicazione sfrutta la rete, cio quella di avere un database condiviso da tutte le postazioni. Quindi, prima di inviare il dati al Server, ne viene controllata la validit dal Client stesso attraverso Javascript. In generale un campo non risulta valido quando il suo valore attribuibile ad un errore d'inserimento da parte dell'utente piuttosto che ad un malfunzionamento della macchina. All'interno dell'HTML le istruzioni Javascript sono racchiuse fra i tag <script> e </script> e possono essere organizzate in funzioni richiamabili dagli eventi associati ai componenti dei moduli. Ad esempio per i bottoni abbiamo l'evento onClick, per i campi di selezione abbiamo l'evento onChange (che si verifica quando viene cambiato l'elemento selezionato nel campo) e per i moduli abbiamo onSubmit. Per moduli si intende l'insieme dei campi da compilare che verranno inviati poi
come dati al Server. Questo insieme non noto a priori ma deve essere dichiarato all'interno dei tag <form> e </form>. Associando un nome attraverso l'attributo name possibile poi inserire pi form all'interno della stessa pagina. Dovendo infine inviarne i valori al Server bisogna specificare anche una pagina di destinazione (che sapr come processare i dati) e la modalit con cui questi dati verranno inviati. La pagina di destinazione viene definita attraverso l'attributo action mentre la modalit di invio attraverso method. Abbiamo a disposizione due modalit: POST e GET. POST la meno versatile ma anche la pi sicura delle due in quanto i parametri vengono passati invisibilmente all'utente. GET invece utilizza la query string, cio la parte terminale dell'url successiva al ? dove vengono scritti i campi come coppia variabile=valore separati dal carattere & (detta e commerciale). La versatilit di questo metodo quella di poter anche forzare la query string, ad esempio con un link che punta alla pagina prova.php? var1=val1&var2=val2 cos alla pagina php arriveranno le variabili var1 e var2 settate rispettivamente a val1 e val2 senza che l'utente abbia immesso niente. In questo modo possiamo anche creare una form che utilizza il metodo POST per passare i campi, ma che punti tramite il campo action ad un indirizzo con una query string preimpostata. Per recuperare i valori nella pagina di destinazione si utilizzano i vettori associativi $_GET e $_POST. Il nome vettori associativi significa che le posizioni al loro interno non sono indicizzate necessariamente da un numero ma anche da parole. Questo vuol dire che, riferendoci all'esempio sopra dell'url prova.php?var1=val1&var2=val2, nella pagina prova.php potremo accedere alle due variabili con le due posizioni del vettore: $_GET['var1'], dove troveremo il valore 'val1', e $_GET['var2'] , dove troveremo il valore 'val2'. Prima di vedere un semplice esempio bene vedere come sia possibile inserire dei commenti all'interno del codice in ognuno dei tre linguaggi. Per commenti si intende delle frasi ignorate dall'interprete (cio alla parte del computer che poi esegue il codice) che vengono utilizzate per spiegare cosa viene eseguito attraverso il codice ad un ipotetico lettore o come promemoria personale. In HTML i commenti sono delimitati dai tag <!-- e --> mentre in php e Javascript, esattamente come avviene per Java, i commenti iniziano con // se occupano una sola riga mentre iniziano con /* e finiscono con */ se occupano pi righe (in alternativa si pu anche far iniziare ogni riga con //, ma piuttosto scomodo). Vediamo ora un esempio di una pagina HTML contenente due form distinte, ognuna delle quali soggetta al controllo in invio sui suoi campi, il cui contenuto verr poi inviato ad una pagina TellMe.php che visualizzer un messaggio dipendente dal contenuto dei campi stessi e dal modulo di provenienza. Facciamo si che la prima contenga una casella di testo e la seconda una di selezione con due valori: testa e croce.
<html> <!quellochedentroilprossimotagvienevisualizzatonellabarradel titolodelbrowser> <title> PaginaconleForm </title> <body><!ilcorpodellapagina> <formname='moduluno'action='TellMe.php?mod=1'method=POST onSubmit='returnverificuno();'> <inputtype=textname=testosize=15> <inputtype=submitvalue='Inviaquesto!'> </form> <br><!conbrilbrowservaacapo> <formname='moduldue'action='TellMe.php?mod=2'method=POST onSubmit='returnverificdue();'> <selectname=selezione> <!creiamoun'opzionedidefault> <optionvalue=0selected=selected>scegli</option> <!poileopzionitestaecroce> <optionvalue=testa>testa</option> <optionvalue=croce>croce</option> </select> <inputtype=submitvalue='Inviaquesto!'> </form> </body> </html> <script> //eoralefunzioniinjavascript functionverificuno(){ /*glielementivannosempreindicaticonNomeForm.NomeComponente anchenelcasoincuicisiaunaformsola*/ if(moduluno.testo.value==''){ /*setestocontieneunastringavuotaavvertel'utenteconil seguentemessaggiod'errore*/ alert('nonhaiscrittonulla'); //poi,restituendofalse,bloccal'invio returnfalse; } } functionverificdue(){ //vienecontrollatoseilvalorenellacaselladiselezionelo //stessodiquellodidefault if(moduldue.selezione.value==0){ alert('nonhaiselezionatonulla'); returnfalse; } } </script>
Per ulteriori risorse fare riferimento ai siti: www.html.it contiene guide al HTML, PHP, Javascript e MySQL. www.php.net, sito ufficiale di PHP nel quale si pu reperire anche la documentazione tradotta (non integralmente) in italiano www.javascriptkit.com/jsref contiene una documentazione NON ufficiale ma molto ricca su Javascript Per la corretta visione delle pagine del programma si consiglia l'utilizzo di versioni di Internet Explorer non inferiori alla 7, qualora si escluda l'utilizzo di qualsiasi browser alternativo. Questo perch, fino alla versione 6, questo browser supporta solo parzialmente il formato aperto per le immagini PNG, standard W3C (l'ente che formalizza gli standard per le pagine internet) gi dal 1997, creato dalla W3C stessa per risolvere i problemi di brevetti che si stavano creando attorno al formato GIF.
L'archivio composto in tutto da cinque tabelle. La tabella operatori non strettamente legata a nessun'altra, fondamentalmente contiene solo l'elenco delle persone che hanno il permesso di registrare i controlli o amministrare il sistema. Per ognuno viene registrato nome utente, la password e il nome completo. Ci che viene riutilizzato poi nelle tabelle dei controli solo il nome completo (o firma), ma non essendo una chiave primaria non pu partecipare alle relazioni. Una chiave primaria un attributo (gli attributi sarebbero pi semplicemente le colonne) o insieme di attributi della tabella che caratterizzano univocamente una tupla (cio una riga o un record) della tabella. Il concetto di chiave primaria sar probabilmente pi chiaro dopo aver analizzato le tabelle del database Controlli. Nella definizione dei campi delle tabelle le chiavi primarie sono sottolineate.
CNR
Campo Tipo varchar(10) int(10) tinyint(3) smallint(5) smallint(5) tinyint(3) float(6,2) float(4,2) float(4,2) float(5,2) float(5,2) varchar(30) tinyint(1)
Tabella contenente i controlli di Riproducibilit (SNR) e CNR. In maniera analoga a tutte le altre tabelle la chiave primaria costituita dall'Inventario e dalla Data. Infatti volendo tenere memoria di un solo controllo al giorno per una macchina (cio per quella macchina in quella data esiste solo un controllo) evidente come questa coppia individui univocamente il controllo. Il campo Esito un numero binario a due bit dove la cifra pi significativa rappresenta il'esito per l CNR, quella meno significativa per l'SNR.
Inv Data Potenziale Carico Forza Spessore MediaAl StdAl StdPMMA CNR
Anodo-Filtro varchar(7)
Esposizione smallint(5)
MediaPMMA float(6,2)
La cifra settata a 1 significa che il valore SNR interno agli estremi di tolleranza. Operatore
Esito
Compensazione
Tabella contenente i controlli di Compensazione. In questo caso, dovendo registrare tre tuple per ogni controllo, lo spessore del fantoccio entra a far parte della chiave primaria. Questo valore non viene inserito dall'utente ma aggiunto direttamente dal programma. Cos in controllo composto da tre righe, una per ogni spessore:30, 50 e 70 mm. Il campo Esito un numero binario che rappresenta l'esito di ogni spessore.
Campo Inv Data Fantoccio Potenziale Carico Anodo-Filtro Forza Spessore Tipo varchar(10) int(11) tinyint(4) tinyint(4) smallint(5) varchar(6) smallint(5) tinyint(4) smallint(6) varchar(30) tinyint(1)
Esposizione La cifra settata a 1 significa che il valore interno Operatore agli estremi di tolleranza. Esito
Giornalieri
Tabella contenente i controlli Giornalieri. In maniera analoga a tutte le altre tabelle la chiave primaria costituita dall'Inventario e dalla Data. Infatti volendo tenere memoria di un solo controllo al giorno per una macchina (cio per quella macchina in quella data esiste solo un controllo) evidente come questa coppia individui univocamente il controllo.
Campo Inv Data Potenziale Carico Anodo-Filtro Forza Spessore Tipo varchar(10) int(11) tinyint(4) smallint(5) varchar(6) smallint(5) tinyint(3) smallint(6) varchar(30) tinyint(1)
l campo Esito un numero binario che, Esposizione settato a 1, indica che il valore interno Operatore agli estremi di tolleranza. Esito
Mammografi
Tabella contenente la lista dei Mammografi. Questa costituita in modo da contenere tutti i dati d'interesse comprese le impostazioni di rete per i mammografi digitali in modo da avere una risorsa da sfruttare nel caso queste impostazioni
Campo Inv Prod Mod Tipo CdC Tipo varchar(10) varchar(20) varchar(20) varchar(2) smallint(5)
Matricola varchar(15)
Reparto
HostName varchar(20)
IP Porta
Operatori
Nella tabella degli operatori stato scelto il nome utente come Campo chiave primaria fra le tante soluzioni possibili, tutte equipollenti. User Non stata scelta la firma in modo da supportare l'omonimia o PSW da dare la possibilit ad singolo operatore di avere pi account . Firma
Tipo varchar(12) varchar(40) varchar(30)
E adesso alcune considerazioni sul dimensionamento dei campi. Le stringhe sono tutte di tipo varchar e fra parentesi viene specificata il numero massimo di lettere che la stringa pu contenere. I valori numerici non interi sono tutti di tipo float, fra parentesi viene indicato il numero di cifre intere e decimali. Per gli interi come Potenziale e Carico necessario fare un discorso a parte in quanto esistono pi tipi di interi che differiscono per la dimensione. Abbiamo allora: tinyint=1 byte (massimo numero rappresentabile: 255) smallint=2 byte (massimo numero rappresentabile: 65535) mediumint=3 byte (massimo numero rappresentabile: 16777215) int=4 byte (massimo numero rappresentabile: 4294967295) bigint=5 byte (massimo numero rappresentabile: 1099511627775)
per tutti i campi interi sono stati utilizzati i tinyint per ottimizzare la dimensione del DataBase. A questa regola fanno eccezione solo tre campi: i campi Carico e Forza sono stati estesi in un secondo momento al formato smallint dopo aver notato che per al volte i valori inseriti superavano quello massimo, il campo Data, essendo un timestamp, richiede 4 byte. Il timestamp rappresenta il numero di secondi trascorsi dal primo gennaio 1970 ad oggi ed una variabile Unix utilizzata in tutti i sistemi. Si preferito salvare in questo modo la data piuttosto che come stringa perch, oltre a risultare pi facilmente gestibile ( sicuramente pi facile ordinare delle date se messe come numeri interi piuttosto che spiegare al computer come interpretare delle stringhe per poi ordinarle), in una stringa ogni carattere occupa un byte (in una data ci sono 10 caratteri).
Cancellazione e Modifica dei Controlli Cancellazione, Modifica ed Inserimento dei Mammografi Cancellazione ed Inserimento degli Operatori Modifica del proprio account
Cancellazione e Modifica dei Controlli 1. Selezioniamo nel men a sinistra la voce Consultazione. Si aprir una pagina contenente diverse caselle di selezione. Se non selezionato selezionare Controlli dalla serie di link in alto a sinistra. 2. Selezioniamo il tipo di controllo e poi a scelta, per restringere il campo di ricerca, il Numero d'Inventario, Operatore, la data d'inizio e quella di fine. Se si vuole che questi dettagli vengano ignorati mantenerli su -Scegli- per le caselle di selezione mentre le date vanno lasciate o reimpostate a GG/MM/AAAA. Prestare attenzione al fatto che le ricerche effettuano l'AND fra i campi quindi, se da un lato si circoscrive la ricerca, dall'altro aumentano e possibilit che non fornisca alcun risultato. 3. Lanciando la ricerca appaiono un'insieme di controlli accompagnati dal nome dell'operatore che li ha eseguiti e due icone:
Modifica: viene aperto un modulo che carica in automatico tutti i valori inseriti dall'operatore. La modifica permessa su tutti i campi ad esclusione di Numero d'Inventario, Data (essendo identificativi del controllo non possono essere modificati) e Operatore (viene lasciato quello dell'operatore che lo ha effettuato la prima volta). Effettuata la modifica viene ripresentata la pagina in cui si trovava il controllo, mostrando i nuovi valori del controllo stesso come responso positivo. Cancellazione: cliccando sul cestino viene aperta una richiesta di conferma generata attaverso Javascript (funzione confirm('msg'); piuttosto che alert('msg');). Confermando il controllo sparisce dall'elenco, annullando non succede nulla.
Attraverso questa ricerca possibile anche, indirettamente, consultare la tabella Mammografi visto che ogni numero d'inventario collegato con un link all'anagrafica del mammografo che rappresenta.
Cancellazione e Modifica dei Mammografi 1. Selezioniamo nel men a sinistra la voce Consultazione. Si aprir una pagina contenente diverse caselle di selezione. Se non selezionato, selezionare Mammografi dalla serie di link in alto a sinistra. 2. Selezionare i valori desiderati fra quelli disponibili. Prestare attenzione al fatto che le ricerche effettuano l'AND fra i campi quindi, se da un lato si circoscrive la ricerca, dall'altro aumentano e possibilit che non
fornisca alcun risultato (ad esempio scegliendo un numero d'inventario e un produttore che non corrisponde a quella macchina). 3. Lanciando la ricerca appaiono un'insieme di mammografi accompagnati da due icone:
Modifica: viene aperto un modulo che carica in automatico tutti i valori i dati della macchina. La modifica permessa su tutti i campi (questa intesa come correzione di un inserimento errato). Effettuata la modifica viene ripresentata la pagina in cui si trovava il mammografo, mostrando i nuovi dati del mammografo stesso come responso positivo. Se viene modificato il numero d'inventario, il programma lo modifica anche in tutti i controlli gi effettuati su di esso. Cancellazione: cliccando sul cestino viene aperta una richiesta di conferma generata attaverso Javascript (funzione confirm('msg'); piuttosto che alert('msg');). Confermando il mammografo sparisce dall'elenco, annullando non succede nulla. Cancellando un mammografo vengono cancellati anche i controlli ad esso associati. Inserimento dei Mammografi 1. Selezionare la voce Nuova Macchina dal men a sinistra. Si aprir un modulo contenente tutti i campi richiesti. 2. Inserire le informazioni nei campi cercando di ripetere con precisione i valori comuni ad altre macchine (Produttore, Modello, Reparto, CdC) per rendere efficace la ricerca. 3. Al termine dell'inserimento, il programma ne comunica l'esito con un messaggio d'errore (alert) se non stato possibile l'inserimento o con un responso positivo (riportato al di sopra del titolo Inserimento di un Nuovo Mammografo) se andato tutto a buon fine Cancellazione degli Operatori 1. Selezioniamo nel men a sinistra la voce Consultazione. Si aprir una pagina contenente diverse caselle di selezione. Se non selezionato selezionare Operatori dalla serie di link in alto a sinistra. 2. Selezioniamo dalla casella di selezione il nome dell'Operatore. Non selezionando nulla viene riportata la lista di tutti gli operatori 3. Lanciando la ricerca appare l'Operatore scelto (o tutti se non ne stato selezionato nessuno) accompagnato da un'icona
cliccandoci sopra viene aperta una richiesta di conferma generata attaverso Javascript (funzione confirm('msg'); piuttosto che alert('msg');). Confermando l'Operatore sparisce dall'elenco, annullando non succede nulla.
Inserimento di un Nuovo Operatore 1. Selezionare la voce Nuovo Operatore dal men a sinistra. Si aprir un modulo con i campi richiesti. 2. Una volta compilati i campi ed inviato il modulo, il programma comunica l'esito dell'inserimento con un messaggio d'errore (alert) se non stato possibile effettuarlo o con un responso positivo (riportato al di sopra del titolo Inserimento di un Nuovo Operatore) se andato tutto a buon fine.
N.M.B. Per inserire un nuovo amministratore inserire come nome e cognome la parola sudo in entrambi i campi. L'amministratore non ha identit certa e si distingue nelle tabelle dalla firma posta appunto pari a sudo (sarebbe stato pi corretto su, cio Super User, ma solo due lettere non mi piacevano quindi Super User DO). Mettendo entrambi i campi a sudo il programma recepisce la volont di creare un nuovo amministratore e ne setta la firma a sudo.
Modifica dell'Account
1. Selezioniamo Modifica Profilo nel Men di sinistra. Si aprir un modulo con i campi richiesti. 2. Inserire tutti i campi (anche quelli che non si vogliono modificare vanno reinseriti uguali a prima). Completata la modifica , il programma comunica l'esito dell'aggiornamento con un messaggio d'errore (alert) se non stato possibile effettuarlo o con un responso positivo (riportato al di sopra del titolo Modulo per la Modifica dei Dati d'Accesso dell'Amministratore) se andato tutto a buon fine.
Inserimento di un Nuovo Mammografo o Modifica di uno Esistente: Numero d'Inventario gi esistente. Essendo chiave primaria non pu essere ripetuto Valori inseriti di dimensione maggiore a quella ammessa. Campi vuoti Valori non numerici in campi numerici Indirizzo IP non corretto.