Luca Vassalli's Website - Home page


Home
Indice

1.Introduzione

2.Centro Solidarietà di Genova

3.Politeama Genovese

 

2.3 Inserimento notizie

Nel decidere come strutturare questa si è cercato di mantenere una chiarezza il più elevata possibile ma, per sfruttare appieno le potenzialità dei menu, è stato comunque necessario spiegare brevemente in forma orale le funzionalità implementate al responsabile dell'amministrazione del sito del Csg.
A questo punto una chiarificazione doverosa è che il file collegato ad una notizia in bacheca elettronica prende nome di "news estesa" in quanto si suppone che contenga maggiori dettagli su di un argomento, accennato nella notizia breve contenuta in bacheca; quindi nel resto della trattazione sarà chiamato "file" ovvero "news estesa" secondo quale, dei due termini, sia maggiormente esplicativo.
Appena viene caricata "inserisci_brevi.PHP", non venendo passati particolari valori in "Get", viene visualizzata una schermata dalla quale si può scegliere una tra le tre seguenti opzioni: inserire una notizia che contiene un collegamento ad un indirizzo assoluto; inserire una notizia e la news estesa ad essa collegata; inserire una news estesa che deve essere collegata ad una notizia già esistente ma che finora "puntava" ad un indirizzo assoluto (fig.3).
Per scegliere la prima possibilità basta compilare il modulo che appare nella pagina con i dati richiesti. Si è scelto di inserire delle frasi nei campi del modulo che aiutino l'utente più inesperto nella compilazione.

Fig. 3 Menu a tendina di 'News estese' e modulo di inserimento notizie
Fig. 3 Menu a tendina di "News estese" e modulo di inserimento notizie

Qualora, invece, volessimo già caricare il file cui la notizia sarà collegata basterà selezionare con il mouse il "qui" in grassetto che termina la prima frase della schermata per essere indirizzati alla pagina "inserisci_estese.PHP" e da qui si potrà compilare un modulo del tutto simile al precedente, dal punto di vista grafico, con l'unica differenza che affianco al campo che contiene il collegamento della notizia c'è un bottone che si chiama "Sfoglia" tramite il quale si può selezionare direttamente sul proprio computer il file da caricare che, ovviamente, può essere un qualunque tipo d'immagine, documento di testo, "pdf" o altro ma che il committente del sito ha già specificato che nella maggioranza dei casi sarà un file HTML contenente tutti i dettagli sulla notizia con ulteriori collegamenti ad altri siti.
Entrambi i moduli indicano dove e quali dati l'utente dovrebbe inserire, nonostante ciò bisogna sempre prevedere che possano essere commessi degli errori cui bisogna porre rimedio. In particolare è critico l'inserimento del titolo e della data giacché sono questi due attributi la chiave nella tabella "News" . Per questo, una volta che il modulo viene inviato, la pagina è ricaricata e si fanno tutta una serie di controlli: si verifica che il campo "Titolo" non valga ancora "Inserisci qui il titolo" oppure "null"; si effettua un'interrogazione al database per verificare che non esista già una notizia con ugual titolo; si inseriscono i dati e quindi si controlla che la riga inserita abbia una data espressa in un formato corretto altrimenti si eliminano i dati dal database. Non si permette il valore nullo sul titolo perché indicherebbe una sicura dimenticanza da parte dell'utente, e si verifica che non esista un'altra riga uguale perché, in caso affermativo, se non si bloccasse per tempo l'inserimento MySql mostrerebbe un messaggio d'errore in inglese che avrebbe il sicuro effetto di disorientare l'utente.
A seguito di tutti queste verifiche si visualizza a schermo un opportuno messaggio che potrà essere "I dati non sono stati registrati perché non hai inserito il titolo alla news, ritenta.","I dati non sono stati registrati perchè hai digitato in maniera errata la data, segui il formato indicato.", "Il database contiene già una query con questo titolo in questa data, scegli un altro titolo.", oppure, in caso di successo, "I dati sono stati inseriti con successo nel database.".
Per realizzare tutti questi controlli sono state utilizzate due variabili ed una serie di blocchi condizionali. Il blocco con l'inserimento del dato nel database è separato da quello che visualizza la conferma di successo a schermo perché in caso di aggiornamento della pagina il primo deve essere comunque visualizzato mentre il secondo no; inoltre sono state separate anche le righe contenenti i collegamenti per inserire un'altra notizia oppure per tornare al menu principale perché queste vanno visualizzate sempre, anche in caso d'aggiornamento della pagina e di notifica d'errore nella compilazione del modulo.
Un controllo comune per entrambi i moduli deve essere fatto sui caratteri contenuti nel titolo: infatti se il titolo contiene un apostrofo bisogna ricordare che il PHP automaticamente vi aggiunge un "backslash" davanti per motivi legati alla gestione delle stringhe quando queste vengono stampate a video o scritte dal PHP all'interno di tag HTML. Questo "backslash" però crea un problema se poi si vuole richiamare la notizia dal database per eliminarla o modificarla. MySql, infatti, elimina il "backslash" nell'operazione d'inserimento nel database ma non nell'operazione di confronto in un'interrogazione: quindi il risultato della "Select * From News Where Titolo='$Titolo' ", è un insieme nullo anche se nel database è effettivamente presente la riga cercata.
Per ovviare a questo inconveniente, che di fatto renderebbe impossibile eliminare o modificare una tupla tramite le funzioni create, si è utilizzato un apposito metodo del PHP ('trim') che serve per eliminare gli apici dalle stringhe. A questo punto si è però verificato un problema legato al motivo per cui il PHP ha inserito il "backslash": PHP ignora tutti i caratteri che seguono questo carattere. La sua mancanza è il motivo per cui l'apice contenuto nel titolo viene interpretato come fine stringa di confronto nell'interrogazione al database. Per esempio nell'interrogazione sopra scritta se "$Titolo" fosse uguale a "L'amicizia" allora quando il PHP sostituisce il valore alla variabile l'interrogazione diventa: "Select * From News Where Titolo='L'amicizia' ". Questa interrogazione genererà errore in quanto MySql penserà di cercare le righe in cui "Titolo='L' e non riuscirà ad interpretare "amicizia' " che viene dopo. L'unico modo per risolvere il problema è, a questo punto, quello di delimitare le stringhe di confronto nell'interrogazione con doppi apici preceduti dal "backslash" così che il PHP li ignori mentre MySql no. La versione corretta dell'interrogazione sarà: "Select * From News Where Titolo=\"$Titolo\" ".
Per quanto concerne l'inserimento delle notizie di cui si vuole anche caricare le news estese, ad esse collegate, il discorso va ulteriormente approfondito. I file sono infatti caricati in una cartella dedicata a questo scopo chiamata "News_estese" e quindi vanno spostati, tramite un'apposita funzione PHP, dalla cartella temporanea in cui sono caricati dal modulo appena questi viene inviato alla pagina indicata dall'attributo "action" del tag 'form'(sempre "inserisci_estese.PHP") in quanto, alla fine dell'interpretazione di questa pagina, se il file temporaneo caricato non sarà stato spostato, verrà eliminato.
Un problema che si è presentato a questo punto consiste nell'impossibilità che in una cartella esistano due file con la stessa estensione e stesso nome e che, quindi, spostando un file in una cartella dove c'è già un file con lo stesso nome, il PHP si limita a sovrascrivere con il file più recente quello più vecchio senza chiedere alcuna conferma.
Verificare se un file di cui si conosce il nome esista o no si può facilmente fare ed in caso di omonimia si deve scegliere fra tre possibilità: sovrascrivere direttamente il primo file senza chiedere conferma all'utente; non sovrascrivere il file di partenza, chiedere se sovrascrivere o meno all'utente in una nuova pagina e, in caso affermativo, fargli ricaricare il file che nel frattempo è andato perduto in quanto non spostato dalla cartella temporanea di sistema; salvare il file in un'altra cartella temporanea, chiedere cosa fare all'utente e cancellarlo o spostarlo a seconda della risposta. Ovviamente la terza scelta è quella maggiormente ottimizzata , ed è questa che è stata adottata, a costo di una programmazione decisamente più complessa in quanto la pagina che compie le operazioni è sempre la stessa e i parametri, per lo più passati in "Get", utilizzati per capire quale operazione compiere di volta in volta sono diversi. Inoltre si sono dovute utilizzare tre variabili di sessione per evitare di tentare di compiere la stessa operazione più volte in caso d'aggiornamento della pagina. Se infatti si compie questa operazione e il programmatore non ha previsto l'eventualità, il codice tenterà di spostare un file che in realtà è già stato spostato e quindi produrrà un codice d'errore difficilmente comprensibile all'utente.
Scendendo nel dettaglio ho risolto il problema in questo modo: appena l'utente invia il modulo il codice va a verificare che non esista già un file con quel nome: in caso negativo sposta il file alla giusta cartella, altrimenti visualizza una schermata in cui si chiede all'utente di selezionare con il mouse la 'Y' se si vuole sovrascrivere il file o la 'N' in caso contrario. Nel frattempo, sempre la stessa pagina sposta il file temporaneo in un'altra cartella e inserisce i dati nel database: altrimenti dovremmo memorizzare tutti i dati in variabili di sessione per non perderli, operazione non consigliabile per i costi in termini di memoria occupata.
La 'Y' e la 'N' sono due collegamenti alla pagina stessa con passati in "Get" i valori del nome del file caricato, del titolo e della data della notizia, in quanto grazie alla chiave di una tabella, ogni tupla è univocamente individuata. Vi è inoltre un'ulteriore variabile ('sovrascrivi') che varrà 'true' se si seleziona con il mouse su 'Y' o 'false' se si seleziona con il mouse su 'N'. La pagina quindi nel caso riceva questa variabile a 1 sposterà il file alla cartella 'News_estese' mentre in caso contrario cancellerà prima il file caricato dalla cartella temporanea in cui si trova e poi la riga contenuta nel database che ha per titolo e data quelli passati in "Get", quindi visualizzerà una schermata dalla quale si può tornare o al menù principale o alla pagina per l'inserimento di news estese.
La seconda opzione che la schermata iniziale d'inserimento visualizza (fig. 3), in altre parole la possibilità di caricare un file come collegamento ad una notizia, già esistente, questa in realtà rimanda alla pagina "modifica_estese.PHP" quindi verrà presa in esame in dettaglio nel prossimo paragrafo.