Corso di Web design Collegio Universitario don Nicola Mazza Che cos'è un linguaggio di programmazione Un linguaggio di programmazione è un linguaggio dotato di un insieme di regole per scrivere programmi per computer, ovvero un insieme di istruzioni che a partire da un insieme di dati di input, applicando una funzione di trasformazione descritta, appunto, dalle istruzioni, produca un insieme di dati di output. In un linguaggio di programmazione si possono distinguere: L'insieme delle parole chiavi: un insieme di parole che hanno un significato particolare per chi deve tradurle in istruzioni eseguibili o deve eseguirle e a ciascuna delle quali corrisponde una azione ben definita. Le parole chiavi non possono essere usate se non per indicare le azioni ad esse associate. Per esempio, in C++, non si può definire una variabile con nome main, essendo questa una parola chiave a cui corrisponde il nome della funzione che viene eseguita all'avvio del programma. In definitiva il linguaggio deve essere non ambiguo. I caratteri speciali: un insieme di caratteri con significati particolari. Per esempio, in C++, sono caratteri speciali: il carattere punto e virgola (;) che chiude una istruzione o il carattere virgola (,) che delimita i componenti di un elenco o il carattere spazio che distingue un componente (una parola) dall'altro. Anche in questo caso, tali caratteri, non possono essere utilizzati se non con quel significato particolare. Un insieme di regole sintattiche: un modo di mettere assieme le parole così da formare frasi per indicare le azioni che devono essere compiute. Una volta note le caratteristiche di un linguaggio di programmazione, si può tradurre un algoritmo in frasi (affermazioni, statement) di quel linguaggio. Ing. Bianco Alessandro Pag. 1 Corso di Web design Collegio Universitario don Nicola Mazza Cos'è un sito web? Un sito web è uno spazio su un computer (server) nel quale chiunque si abboni può dire "questo sono io, questo è che cosa faccio, che cosa conosco, o che cosa vendo. E' una fonte elettronica di informazioni riguardanti voi o la vostra attivita', disponibile al mondo intero 24 ore al giorno. All'interno del sito web, ogni schermata contenente informazioni è denominata pagina. Le pagine possono contenere il testo, immagini, o persino fotografie, audio e video e tanto altro. Alcune delle caratteristiche principali delle PAGINE WEB sono i collegamenti ipertestuali (links). I links possono essere cliccati con il mouse del vostro pc e servono a trasportare i visitatori alle altre pagine del sito (navigazione). La CGI Un primo passo verso un uso più dinamico del Web, che lo facesse evolvere da una semplice collezione di ipertesti ed ipermedia è stato quello di permettere ai server di comunicare con applicazioni esterne. In questo contesto nasce la Common Gateway Interface, che è, essenzialmente, un processo di tipo server-side che fa da tramite tra il server Web ed altre applicazioni o risorse generiche (database, immagini, video, ecc.) residenti anche su macchine diverse, fornendo un'interfaccia per apposite applicazioni esterne, denominate anche "gateway programs", script CGI o, ancora, programmi CGI. Tale interfaccia permette di astrarre dai dettagli della comunicazione dei dati, offrendo al programmatore la possibilità di focalizzare l'attenzione esclusivamente sui due fattori per lui più importanti: 1. Quali dati fornire come input 2. Come elaborare i dati ottenuti in output 3. I meccanismi da imparare sono pertanto quelli necessari a maneggiare i dati che il server passa al programma e a restituire i dati da questo generati. I programmi CGI I programmi CGI estendono le funzionalità base del server Web, dandogli la capacità di servire una varietà di richieste utente che altrimenti non potrebbe gestire. Contengono il codice che permette di ricevere i dati dal server ed elaborarli a seconda delle necessità. Possono essere realizzati in qualsiasi linguaggio supportato dal server Web. Flusso dei dati in un processo CGI Ing. Bianco Alessandro Pag. 2 Corso di Web design Collegio Universitario don Nicola Mazza Tipicamente, il flusso dei dati in un processo CGI avviene come in figura, seguendo il seguente iter: 1. Un client Web realizza una connessione con un server Web (tipicamente tramite un browser), all'indirizzo specificato nella URL. 2. Il client Web invia una richiesta (tramite uno tra i metodi POST e GET visti nel paragrafo precedente). 3. I dati inviati dal client sono passati dal server al programma CGI referenziato nella URL. 4. Il programma CGI legge i dati ed esegue il processo per cui è stato creato. 5. Il programma CGI genera un risultato da restituire al client tramite il server, come risposta alla richiesta del punto 2. Tale risultato è tipicamente sotto forma di documento HTML, ma può essere anche un altro tipo di documento. 6. Dopo aver passato la risposta fornita dal programma CGI al client, il server chiude la connessione aperta al punto 1. Flusso dei dati in un processo CGI Gestione dell'I/O Un server Web ed un programma CGI possono comunicare e passarsi i dati l'un l'altro in quattro modi: Variabili d'ambiente: contengono valori settati dal server Web che deve eseguire lo script ed ivi mantenute. Si distinguono due tipi di variabili d'ambiente: Quelle il cui valore è settato indipendentemente dal tipo di richiesta del client. Quelle, denominate "request-specific", dipendenti dal tipo di richiesta effettuata dal client. Fra queste una serie di variabili contenenti i valori delle variabili di richiesta HTTP trattate nel paragrafo 2.1. Permettono di accedere ai dati forniti dal client, di determinare il tipo di browser Web in uso, di mantenere e passare informazioni sullo stato tra diverse richieste indipendenti, sopperendo così allo svantaggio del linguaggio HTML di essere stateless. Ing. Bianco Alessandro Pag. 3 Corso di Web design Collegio Universitario don Nicola Mazza La lista completa di tutte le variabili d'ambiente è sostanzialmente lunga e può variare da server a server, è comunque utile esaminarne qualcuna per capire, nella pratica, come e dove intervengano. Le prime tre variabili esaminate coincidono con le variabili di richiesta HTTP inviate al Server dal browser del Client per riconoscere il tipo di trasmissione (GET/POST) e gestirla di conseguenza. REQUEST_METHOD QUERY_STRING del programma CGI. Consideriamo, ad esempio, il seguente URL: http://www.uniud.it/cgi-bin/test.cgi?test di prova nella directory cgi-bin presente sull'host il cui indirizzo Internet è www.uniud.it. L'input, costituito dalla stringa "test di prova" viene passato al programma ponendolo nella variabile QUERY_STRING come segue: QUERY_STRING = test+di+prova Osservazione: Il browser pone i valori nella URL, come nell'esempio appena visto, in due casi: quando al suo interno viene definito un Form HTML, con il metodo GET specificato, oppure quando nella testata della pagina HTML viene posizionato un particolare elemento, chiamato ISINDEX, che provoca l'inserimento nella pagina di un campo di input simile al controllo per l'inserimento di una stringa, già visto esplorando i Form. In questi due casi, quando l'utente esegue il comando di SUBMIT (ovvero clicca sul bottone atto a far eseguire l'operazione di invio dati – data submitting), il browser legge i valori e li posiziona a completamento dell'URL. CONTENT_LENGTH durante una richiesta. Qualora venga utilizzato il metodo POST, il server non invia alcun indicatore di fine-file, ecco quindi che CONTENT_LENGTH diventa fondamentale per conoscere l'esatta dimensione dell'input da leggere. Esempio: Considerando il seguente form HTML <FORM ACTION = "...." METHOD=POST> <INPUT NAME="A" SIZE=5> {Input="A B C"} <INPUT NAME="B" SIZE=4> {Input="1234"} Ing. Bianco Alessandro Pag. 4 Corso di Web design Collegio Universitario don Nicola Mazza </FORM> All'atto dell'invio dei dati il programma CGI riceve i seguenti valori: CONTENT_LENGTH = 14 STDIN: A=A+B+C&B=1234 AUTH_TYPE l'autenticazione ed esegua i programmi CGI in modalità protetta. Standard Input: è lo standard input file descriptor di sistema. Su molti sistemi Unix, ad esempio, lo Standard Input è il buffer dove un comando o un programma leggono il proprio valore di input. Tipicamente coincide con un dispositivo terminale di input o con l'output di un altro programma. Standard Output: è lo standard output file descriptor di sistema. Tipicamente coincide con un dispositivo terminale di output o con l'input di un altro programma. Command line: è un metodo attraverso il quale i dati vengono prelevati e passati al programma così come sono stati messi nella riga di comando resa disponibile dall'elemento ISINDEX. Per passare i valori al programma CGI viene utilizzato lo standard Unix, inviando un array di puntatori a stringhe, che formano l'input, ARGV, ed una quantità, ARGC, indicante il numero di valori significativi nell'array ARGV. Un metodo addizionale di comunicazione è stato sviluppato per un'implementazione specializzata della CGI, conosciuta come Windows CGI (o WinCGI) ed operante su macchine con sistema operativo MS Windows. Tale metodo si basa sull'utilizzo di un file temporaneo caratterizzato dall'estensione .INI, che viene utilizzato come segue: 1. Al momento del ricevimento della richiesta del client, il server preleva i dati inviati nell'header della stessa, li converte in variabili associate ad un nome, combina queste con altre variabili d'ambiente e le salva nel file .INI. Ulteriori dati ricevuti dal client e non presenti nell'header, vengono invece salvati in un altro file temporaneo (lo identificheremo come file temporaneo di input) 2. Il server decodifica ed analizza il contenuto di ogni form presente nella richiesta. Associa una variabile ad ogni campo del form ed aggiunge queste al file .INI. 3. Il server crea un nome per il file temporaneo di output, e lo aggiunge, assieme al nome del file temporaneo di input, al file .INI. A questo punto, tutti i dati necessari all'esecuzione del programma CGI sono presenti nel package formato dal file .INI e dal file temporaneo di input. 4. Il programma CGI, una volta lanciato dal server tramite la procedura di sistema CreateProcess(), localizza il file .INI (l'indirizzo viene fornito a cura della CreateProcess). Ing. Bianco Alessandro Pag. 5 Corso di Web design Collegio Universitario don Nicola Mazza 5. Dopo aver seguito i suoi compiti, il programma CGI tipicamente genera una risposta da inviare al browser del client. A tal fine crea un file temporaneo di output, utilizzando il nome creato precedentemente dal server, e vi scrive i dati. Questi sono organizzati in due sezioni: una intestazione atta a definire il tipo dei dati che può variare da semplice testo ascii piano, a testo HTML a immagini o altro ancora, e l'effettivo contenuto informativo della risposta. 6. Non appena il server determina la fine dell'esecuzione, legge i dati dal file temporaneo di output, li riorganizza in modo da creare una risposta aderente al protocollo HTTP, e così li invia al browser del client. Flusso dei dati in un processo Windows CGI CGI e sicurezza Eseguire un programma CGI comporta dei rischi. Per usare le parole di Bob Breedlove, esperto nell'uso di questa tecnica, è un po' come "invitare il mondo ad eseguire un programma sul nostro sistema". In effetti, ciò che avviene è proprio che da un generico browser, vengano lanciate, sul nostro server, delle attivazioni di processi. Attivazioni, per altro, facilmente localizzabili e modificabili, giacché sono innestate nelle pagine HTML caricate sul browser del client. Qualora qualche malintenzionato riuscisse a modificare in maniera congruente il nome del processo da eseguire, attivandone un altro, gli effetti sul sistema potrebbero essere disastrosi. Se il malintenzionato fosse anche in grado di installare del codice malizioso sul Server, una sorta di virus informatico, ebbene tramite la CGI sarebbe in grado di attivarlo comodamente seduto davanti al proprio computer! Per evitare tali abusi, sono state applicate, nel tempo, regole e restrizioni. La maggior parte degli HTTP daemon pone i seguenti limiti ai programmi CGI da eseguire: Ing. Bianco Alessandro Pag. 6 Corso di Web design Collegio Universitario don Nicola Mazza Limiti sulle azioni da eseguire. Ai programmi CGI si impediscono quelle azioni ritenute particolarmente pericolose per il sistema, come, ad esempio, la cancellazione dei file o l'installazione di programmi eseguibili. Limiti sul campo di accessibilità alle informazioni. Consistono nel rendere le directory o i singoli file ritenuti di interesse riservato inaccessibili ai programmi CGI. Limiti sulla posizione dei programmi CGI eseguibili. Raggruppando tutti gli script eseguibili dal server in una directory si può evitare l'attivazione dall'esterno di codice malizioso nascosto chissà dove nel sistema. Il raggruppamento semplifica, inoltre, il controllo continuo sul codice di script installato. L'utilizzo ulteriore di password, in alcuni casi, può permettere di alleggerire i limiti. Limiti di performance della CGI Sebbene la CGI costituisca uno strumento sostanzialmente duttile per ottenere interattività sul Web, ammettendo l'uso di diversi linguaggi , interpretati o compilati, permettendo, come visto, in accordo con la politica di sicurezza adottata, di accedere potenzialmente a tutte le risorse del sistema e venendo così incontro alle esigenze più eterogenee, soffre di un limite importante, insito nel proprio meccanismo di funzionamento. Ogni volta che da un browser viene lanciata l'esecuzione di uno script, il server, ricevuta la richiesta, crea un nuovo processo , e questo, per un sito ad alto traffico può portare ad un superlavoro per il processore, con conseguente drastico decadimento di tutte le prestazioni del sistema. Ing. Bianco Alessandro Pag. 7 Corso di Web design Collegio Universitario don Nicola Mazza Che cosa può fare PHP? Qualsiasi cosa. PHP ha come obiettivo principale lo scripting server-side, per cui può fare tutto ciò che può fare un qualunque programma CGI, come raccogliere dati da un form, generare pagine dai contenuti dinamici, oppure mandare e ricevere cookies. Ma PHP può fare molto di più. Esistono tre campi principali in cui vengono usati gli scripts PHP. Lo scripting server-side. Questo è il campo più tradizionale ed il maggiore obiettivo del PHP. Per fare questo lavoro occorrono tre cose. Il parser PHP (CGI o server module), un webserver ed un browser web. Occorre avviare il server web con un'installazione di PHP attiva. Si può accedere all'output del programma PHP con un browser web e vedere la pagina PHP tramite il server. Tutto ciò può essere attivato sul pc di casa se si desidera semplicemente provare la programmazione PHP. Consultate la sezione Istruzioni per l'installazione per ulteriori informazioni. Lo scripting di righe di comando. Si può creare uno script PHP da usare senza alcun server o browser. Per usarlo in questo modo, l'unica cosa necessaria è un parser PHP. Questo tipo di utilizzo è ideale per gli scripts eseguiti con cron (sui sistemi *nix o Linux) oppure il Task Scheduler (su Windows). Questi script possono essere utilizzati per semplici task di processamento testi. Vedere la sezione Uso di righe di comando in PHP per maggiori informazioni. Scrittura di applicazioni desktop. Probabilmente PHP non è il linguaggio più adatto per scrivere applicazioni desktop, con interfaccia grafica, ma, se lo si conosce molto bene, e se se ne vogliono usare delle caratteristiche avanzate in applicazioni client-side, si può anche adoperare PHP-GTK per scrivere questo tipo di pogrammi. Allo stesso modo, c'è anche la possibilità di scrivere applicazioni cross-platform. PHP-GTK è un'estensione di PHP non reperibile nella grande distribuzione. Se vi interessa, visitate » il sito web. PHP può essere usato su tutti i principali sistemi operativi, inclusi Linux, molte varianti di Unix (compresi HP-UX, Solaris e OpenBSD), Microsoft Windows, MacOS X, MacOS Xserver, RISC OS, e probabilmente altri. Inoltre supporta anche la maggior parte dei server web esistenti. Ciò comprende Apache, IIS, e molti altri. E questo include qualsiasi server web che può utilizzare il binario PHP FastCGI, come lighttpd e nginx. PHP funziona sia come un modulo, o sia come un processore CGI. Pertanto, con PHP si ha la libertà di scegliere praticamente qualsiasi sistema operativo e qualsiasi server web. Inoltre, si può anche scegliere se fare uso di una programmazione procedurale oppure orientata agli oggetti (OOP), o una combinazione di entrambe. Con PHP non siete limitati soltanto ad un output in HTML. Le possibilità di PHP, infatti, includono l'abilità di generare immagini, files PDF e perfino filmati Flash al volo (utilizzando libswf e Ming). Sarete in grado di generare facilmente qualsiasi testo, come XHTML e qualsiasi altro file XML. PHP può autogenerare questi file, e salvarli nel file system, piuttosto che eseguire un printing esterno, o creare server-side cache per contenuti dinamici. Una delle caratteristiche più importanti e significative di PHP è la possibilità di supportare una completa gamma di database. Scrivere una pagina web collegata ad un database è incredibilmente semplice utilizzando una delle specifiche estensioni del database (p.e., per mysql), o utilizzando un abstraction layer come PDO, o connettendosi a qualsiasi database che supporta lo standard Open Ing. Bianco Alessandro Pag. 8 Corso di Web design Collegio Universitario don Nicola Mazza Database Connection tramite l' estensione ODBC. Altri database possono utilizzare cURL o i socket, come CouchDB. PHP fa anche da supporto per dialogare con altri servizi utilizzando i protocolli del tipo LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (in Windows) e innumerevoli altri. Potete anche aprire network sockets ed interagire usando qualsiasi altro protocollo. Inoltre supporta l'interscambio di dati complessi WDDX tra, virtualmente, tutti i linguaggi di programmazione web. A proposito di interconessioni, PHP supporta l'istanziazione dei Java Objects e l'utilizzo di questi come oggetti PHP in modo trasparente. PHP possiede utili caratteristiche per l'elaborazione testi, che includono la compatibilità alle espressioni regolari di Perl (PCRE), e molte estensioni e strumenti per analizzare e accedere ai documenti XML. PHP standardizza tutte le estensioni XML sulla solida base di libxml2, ed estende le caratteristiche aggiungendo il supporto SimpleXML, XMLReader e XMLWriter. E molte altre estensioni interessanti esistono, e sono categorizzate sia in ordine alfabetico che per categoria. E ci sono latre estensioni PECL che possono essere o no documentate all'interno del manuale PHP, come » XDebug. Ing. Bianco Alessandro Pag. 9 Corso di Web design Collegio Universitario don Nicola Mazza Quali sono le differenze tra un sito statico ed uno dinamico? La locuzione Web statico viene utilizzata per identificare un modo di progettare i siti web. Si parte dal presupposto che all'utente non sia consentito modificare lo stato e le informazioni contenute dal sito stesso. I siti web statici sono stati la prima tipologia di siti web dato che sono relativamente semplici da realizzare e il web master deve preoccuparsi esclusivamente di creare le pagine che compongono il sito. La maggioranza dei siti web con il passare del tempo è migrata verso il web dinamico. Questo consente una manutenzione e aggiornamento del sito semplice veloce e consente una maggior interazione dell'utente pur essendo tecnologicamente più complessa di una implementazione statica. Tutte quelle attività con grosse quantità di contenuti o prodotti che hanno l'esigenza di frequenti aggiornamenti (nuove offerte, pacchetti, prodotti, news, documentazioni, gallerie di immagini etc..) hanno la necessità di un sito dinamico. Quest'ultimo presenta un costo più elevato in fase di realizzazione (dato dalla presenza appunto del database e del CMS) che però in brevissimo tempo viene ammortizzato dall'assenza di costi di aggiornamento, aggiornamenti ad opere del cliente stesso. Perchè è molto importante seguire gli standard W3C nello sviluppo di un sito web? Il termine W3C significa World Wide Web Consortium. Il W3C si occupa di stabilire standard di riferimento per il Web. Realizzare un sito rispettando le linee guida del W3C significa non solo rendere i contenuti accessibili a tutti gli utenti, compresi coloro che sono affetti da una qualche forma di disabilità o utilizzano sistemi operativi non aggiornati e terminali obsoleti, ma anche rendere il sito più facilmente interpretabile dai motori di ricerca e quindi meglio posizionabile. Differenza fra HTML e PHP Cosa succede alle pagine HTML? Quando arriva una richiesta di una pagina HTML da un browser, il server web compie 3 passi: 1. legge la richiesta dal browser 2. trova la pagina nel server 3. manda la pagina al browser Cosa succede alle pagine in PHP? Invece di restituire una pagina HTML statica il server compie alcune azioni, secondo i comandi scritti nel codice PHP: il motore PHP compierà le decisioni necessarie per creare la pagina. Il server web dunque: Ing. Bianco Alessandro Pag. 10 Corso di Web design 1. 2. 3. 4. Collegio Universitario don Nicola Mazza Legge la richiesta dal browser Trova la pagina nel server Compie le istruzioni scritte nel codice PHP Manda la pagina al browser La differenza principale fra HTML puro e PHP è dunque che il primo viene interpretato dal browser, mentre il secondo viene eseguito sul server. Ing. Bianco Alessandro Pag. 11 Corso di Web design Collegio Universitario don Nicola Mazza Cos’è Asp.Net Prima di tutto va spiegato il concetto che Asp.Net non è un linguaggio di programmazione ma una tecnologia basta sul .NET Framework della Microsoft. Si sente spesso dire: “scritto in Asp.net”, oppure “in linguaggio Asp.Net”, non esistono concetti più lontani dalla verità come questi. Asp.Net è una tecnologia che deriva dall’ormai deprecato parente ASP (Active Server Pages), dal quale ha ereditato solo il nome e nient’altro. Asp.Net è una tecnologia che lavora in maniera integrata con il server che la ospita. Questo fa sì che le sue istruzioni non vengano interpretate come con altre tecnologie, ma bensì compilate a livello nativo come software installati all’interno del server. Per questo applicazioni e siti web che utilizzano tecnologia Asp.Net possono essere scritti in linguaggi differenti come: Visual Basic .Net (diretto discendente del deprecato Visual Basic), C# (si legge sharp, ed è una visione Microsoft del C++), J# (altra visione Microsoft del Java), C++ (molto utilizzato per creare applicazioni troppo poco per creare elementi web). A cosa serve Asp.Net Abbiamo detto che la tecnologia Asp.Net eredita le sue funzioni dal vecchio ASP, quindi deduciamo che il suo utilizzo sia principalmente orientato alla creazione di applicazioni o siti web basati su strutture lato server. Abbiamo anche detto che è una tecnologia compilata e non interpretata quindi, anche in questo caso, deduciamo che le sue prestazioni sono altamente notevoli in quanto ogni sito web può lavorare come un’applicazione installata all’interno del server e non come singoli file di testo elaborati e poi restituiti. Asp.Net raggiunge il suo culmine durante le operazioni con i database, per i quali dispone diverse classi e metodi condivisi capaci di facilitare e velocizzare ogni operazione di interrogazione e modifica anche in maniera disconnessa. Da tutto questo si evince quanto possa essere potente e relativamente facile costruire applicazioni web basate completamente su database. Come funziona Asp.Net Il suo funzionamento è simile quello di qualsiasi altra tecnologia lato server, ovvero: 1. Il cliente fa una richiesta al server che ospita il sito web 2. Il server elabora la risposta in base alla richiesta 3. Il server invia la client la risposta corretta alla sua richiesta Ing. Bianco Alessandro Pag. 12 Corso di Web design Collegio Universitario don Nicola Mazza Semplicissimo… Ma allora dove risiede il miglioramento? È ovvio nella struttura. La tecnologia Asp.Net ci dà la possibilità di dialogare a livello nativo con il server che ospita il sito web, quindi di conseguenza possiamo accedere via codice (scelto) ad ogni risorsa come una vera e propria applicazione desktop. Di seguito un piccolo elenco delle operazioni più comuni nella costruzione di un sito web eseguibili semplicemente installando il framework (l’attuale versione è la 4.5) adeguato sul server. Gestione del login per aree riservate Asp.Net possiede potenti classi e controlli integrati per la gestione delle aree riservate che utilizzano database nativi, semplificando ed a volte annullando la scrittura di codice. Visualizzazione di dati ripetuti è possibile creare elenchi di dati ripetuti pescati da database utilizzando i controlli Asp.Net semplicemente inserendoli all’interno della pagina. Uplodare file, inviare e-mail da form, leggere e scrivere file di qualsiasi tipo Nel vecchio ASP queste erano operazioni che richiedevano l’installazione sul server di librerie aggiuntive (spesso a pagamento). In Asp.Net è possibile utilizzare controlli già preimpostati per eseguire ognuna di queste operazioni. Lettura dei file XML o JSON Asp.Net dispone di innumerevoli classi capaci di dialogare in modo diretto (ma soprattutto lato server) con queste architetture trasformandole in veri e propri oggetti Asp.Net. Integrazione AJAX passare script client al server e viceversa è una delle peculiarità delle ultime versioni del .NET Framework. Conclusioni Scrivere applicazioni e siti web con la stessa potenza e gli stessi linguaggi utilizzati per creare applicazioni desktop, questa è la tecnologia Asp.Net. Questo articolo per quanto prolisso ha toccato il mondo .Net con estrema superficialità, se si pensa che la stessa tecnologia può essere utilizzata per creare Software Desktop, APPS o software multimediali integrati in Silverlight ed Adobe Flash. Ing. Bianco Alessandro Pag. 13 Corso di Web design Collegio Universitario don Nicola Mazza Cos’e’ un frame work? Un framework è definito da un insieme di classi astratte e dalle relazioni tra esse. Istanziare un framework significa fornire un'implementazione delle classi astratte. L'insieme delle classi concrete, definite ereditando il framework, eredita le relazioni tra le classi; si ottiene in questo modo un insieme di classi concrete con un insieme di relazioni tra classi. Alla base di un framework c'è sempre una serie di librerie di codice utilizzabili in fase di linking con uno o più linguaggi di programmazione, spesso corredate da una serie di strumenti di supporto allo sviluppo del software, come ad esempio un IDE, un debugger o altri strumenti ideati per aumentare la velocità di sviluppo del prodotto finito. L'utilizzo di un framework impone dunque al programmatore una precisa metodologia di sviluppo del software. Scopi di utilizzo La sua funzione è quella di creare una infrastruttura generale, lasciando al programmatore il contenuto vero e proprio dell'applicazione. Lo scopo di un framework è infatti quello di risparmiare allo sviluppatore la riscrittura di codice già scritto in precedenza per compiti simili. Questa circostanza si è presentata sempre più spesso man mano che le interfacce utente sono diventate sempre più complesse, o, più in generale, man mano che è aumentata la quantità di software con funzionalità secondarie simili. Ad esempio, il tipo di interazione con l'utente offerto da un menu a tendina sarà sempre la stessa indipendentemente dall'applicazione cui il menu appartiene (o almeno questo è ciò che l'utente si aspetta); in casi come questo un framework, che permette di aggiungere la funzionalità di una finestra con un menu a tendina con poche righe di codice sorgente a carico del programmatore, o magari permettendogli di disegnare comodamente il tutto in un ambiente di sviluppo, permetterà al programmatore di concentrarsi sulle vere funzionalità dell'applicazione, senza doversi far carico di scrivere codice "di contorno". Ing. Bianco Alessandro Pag. 14 Corso di Web design Collegio Universitario don Nicola Mazza Cos'e' uno scripting language Si suole dividere i linguaggi di programmazione in linguaggi generali come Java,C++,etc e linguaggi di scripting(in inglese linguaggi che permettono di scrivere script o copioni invece di programmi). Esempi di scripting languages sono Javascript e Perl. Questa divisione ,a voler essere precisi, e' arbitraria e si potrebbe sostenere che uno scripting language come Javascript puo servire a scrivere un qualsiasi programma come un linguaggio generale. In effetti gli scripting languages hanno di solito alcune caratteristiche come quella di essere facili da usare, di essere interpretati (e non compilati), di permettere un controllo rapido della correttezza del programma e quindi di poter arrivare a sviluppare in tempi molto piu' brevi un'applicazione. D'altra parte sono piu' lenti in esecuzione ed e' probabile che un programma Javascript non riuscira' mai ad eseguire in tempi accettabili un'attivita' che richiede molti calcoli come disegnare un frattale. Mentre questo puo' essere un compito ideale per un applet Java. Un altro compito nel quale gli scripting languages eccellono e' quello di fare da collante tra applicazioni diverse sullo stesso computer permettendo il passaggio di dati tra un'applicazione e l'altra.Di questo uso se ne parla in questa introduzione per quanto riguarda Javascript. Ing. Bianco Alessandro Pag. 15 Corso di Web design Collegio Universitario don Nicola Mazza PHP Il sito scritto con codice PHP è un sito cosiddetto "dinamico", ovvero un sito web che una volta realizzato, può essere modificato in manienra COMPLETA nei suoi contenuti in ogni momento da parte dell'utente finale direttamente online. In questa maniera si può anche realizzare un sito web dinamico orientato alle vendite online, il cosiddetto eCommerce. Anche in questa tipologia, come quella ASP, tutte le pagine prelevano i contenuti direttamente da un DataBase comune, dove risiedono tutte le informazioni del sito PHP dinamico. Ricordo sempre che: Un DataBase è come un contenitore dentro il quale poter inserire tutte le informazioni che vogliamo. E' come avere un'enorme "cassettiera" dove dentro ad ogni cassetto risiedono le informazioni che identificano ogni pagina web del sito. La modifica del proprio sito da parte dell'utente si può avere grazie ad una apposita sezione Ing. Bianco Alessandro Pag. 16 Corso di Web design Collegio Universitario don Nicola Mazza "privata" realizzata ad hoc, alla quale potrà accedervi soltanto il proprietario del sito web, che permette di poter modificare in ogni momento TUTTE le parti del proprio sito. Come ad esempio: Modificare i contenuti delle proprie pagine web Inserire nuove pagine o eliminarne delle altre Inserire Filmati o clipart Inserire immagine Poter monitorare completamente gli accessi Poter ampliare il proprio sito aggiungendo un eCommerce, ovvero la vendita online dei prodotti del proprio negozio Creare dei forum o blog dove poter interagire con altri utenti Creare sezioni del sito private, dove è richiesta un registrazione per potervi accedere Inserire file da poter far scaricare ai visitatori Ecc.. Questa tipologia è adatta a coloro i quali hanno intenzione di avere un sito, o forse è meglio definirlo come PORTALE, completo, totalmente modificabile ed amministrabile. Anche qui è possibile usufruire di tutte queste funzionalità senza dover richiedere l'intervento di un esperto informatico. Ing. Bianco Alessandro Pag. 17 Corso di Web design Collegio Universitario don Nicola Mazza Cos’è EasyPHP? Non è solo un software, ma un ambiente di sviluppo comprendente un server web Apache, un server di database MySQL, un interprete di script PHP e un amministratore di database MySQL con interfaccia grafica chiamato phpMyAdmin. Tutti questi componenti sono installati insieme per avere in un volta sola tutto il necessario per iniziare lo sviluppo locale di siti web in PHP. EasyPHP dispone di un'interfaccia d'amministrazione che permette di gestire gli utenti, l'avvio e lo spegnimento dei server. Il server Apache crea automaticamente di default un dominio virtuale (in locale) all'indirizzo di localhost (http://127.0.0.1). EasyPHP può essere utilizzato come applicazione portatile, per esempio attraverso una chiave USB. Cos’è Phpmyadmin ? Phpmyadmin e' un sistema Visuale per la gestione di un Database MySQL. E' scritto in PHP e serve per visualizzare il contenuto dei Database che sono installati sul server (o client) su cio' lavora MySQL. Attraverso questa interfaccia si possono creare nuovi database, modificare quelli esistenti ed intervenire sui contenuti dei singoli campi. Ing. Bianco Alessandro Pag. 18 Corso di Web design Collegio Universitario don Nicola Mazza Cos'e' PDO ? PDO e' un' estensione in grado di pilotare database di diverso tipo tramite un' unica interfaccia ( o meglio classe ) che con gli stessi metodi opera su mysql, mysql 4.x, sqlite 2.x, sqlite 3.x , PostgreSQL, sqlserver, oracle e chi piu' ne ha piu' ne metta. Solitamente questo tipo di classe, che racchiude un insieme di sotto classi trasparenti per l'utente, viene definito layer di astrazione. Parlando di PDO parliamo di PHP 5 e parlando di PHP 5 parliamo di programmazione ad oggetti, quindi se sapete poco / niente della OOP di php vi consiglio di leggere gli articoli di http://freephp.html.it e di documentarvi un po' prima di continuare a leggere. Perche' PDO ? PDO e' utile, indispensabile, per rendere un applicativo portabile su diverse piattaforme e diversi databases . E' quello che mancava al php e che in tanti hanno tentato di creare, una classe per tutti i databases ... e finalmente ecco che l' evoluazione PECL e' diventata sufficientemente stabile per includere questa estensione nella futura versione del php, la 5.1 . E' gia' presente, ovviamente, nella attuale distribuzione della 5.1 beta 2 , presente sul sito www.php.net . Differenze sostanziali dal solito "_connect" e "query" ? Le differenze maggiori sono date dal fatto che si usano oggetti, quindi se programmavate gia' ad oggetti non ce ne sono a livello di sintassi. A livello concettuale invece, si utilizza un' insieme di operazioni ormai standard o comuni per molti linguaggi, in grado di preparare query, eseguire transazioni, ricevere errory di eccezione ed altro ancora. Una pillola interessante che puo' fornire sufficiente conoscenza dei concetti e della sintassi che andremo ad utilizzare e' quella che parla di PHP5 e dell' estensione MySQLI. Se l' avete gia' letta andiamo avanti, altrimenti dategli un' occhiata poiche' vengono spiegate bene i vari metodi per prendere o inserire informazioni in modo sicuro. Ecco il link: http://forum.html.it/forum/showthread.php?threadid=624870 PDO dalla a alla z Installazione A differenza di quanto e' riportato sul manuale, una volta installato PHP 5.1 beta 2 o 5.1 che sia , dovrete semplicemente aggiungere alle estensioni utilizzate quelle relative al pdo ed il database che si vuole gestire. Non serve quindi mettere la riga seguente: Ing. Bianco Alessandro Pag. 19 Corso di Web design Collegio Universitario don Nicola Mazza extension=php_pdo.dll poiche' il file non e' nemmeno presete in questa distribuzione. Bastera' mettere direttamente le estensioni che ci interessano, ovvero queste: extension=php_pdo_mysql.dll extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll Ovviamente se volete usare altri database potete aggiungere le restanti: extension=php_pdo_firebird.dll extension=php_pdo_mssql.dll extension=php_pdo_oci.dll extension=php_pdo_oci8.dll extension=php_pdo_odbc.dll Riavviate Apache e vedete se nel phpinfo(); c'e' una o piu' parti inerenti il driver PDO e relative versioni. Costruttore di un oggetto PDO $mypdo = new PDO( $string_dsn [, $string_username [, $string_password [, $array_driver_options]]] ); $string_dsn => la stringa che indica il tipo di database e l' host con o senza porta / file da utilizzare Alcuni esempi: $string_dsn = 'mysql:host=localhost;dbname=test'; // mysql $string_dsn = 'sqlite:myfile.sqlite'; // sqlite Tutti gli altri esempi di come impostare il dns li trovate qui: http://it2.php.net/manual/it/function.pdo-construct.php $string_username => l' utente con la quale volete connettervi, esempio 'root' $string_password => l' eventuale password di connessione al database $array_driver_options => Un array con coppie chiavi=>valorei specifici per la connessione di questo oggetto / database. Il metodo migliore per gestire una connessione al database e' il try catch, dove sul catch PDO ha la sua eccezione dedicata: try { $mypdo = new PDO($dns, $user, $pass); } catch(PDOException $e) { echo 'Errore di connessione: '.$e->getMessage(); } Ing. Bianco Alessandro Pag. 20 Corso di Web design Collegio Universitario don Nicola Mazza PHP/MySQL: esempi pratici di utilizzo dei prepared statements con PDO Uno degli ambiti di utilizzo pratico più importanti per i Prepared statements è quello che prevede l'invio di parametri per le query tramite campi form compilabili dagli utenti o querystring presenti nella URL di una pagina web (e pertanto facilmente alterabili dall'esterno), in questo caso, infatti, gli input non vengono determinati a priori dallo sviluppatore e il loro contenuto rimane sconosciuto all'applicazione fino al momento dell'elaborazione, anche se potenziamente pericoloso in quanto utilizzabile per veicolare istruzioni malevole. Un semplice esempio riguardante il caso proposto potrebbe essere il seguente dove viene impiegato un modulo contenente un solo campo di testo: <form action="ps_pdo.php" method="POST"> Il cognome dell'autore di "Le mie prigioni"?:<br /> <input type="text" name="cognome"><br/> <input type="submit" value="Invia"> </form> Tale campo permette di inviare un parametro che verrà utilizzato nel file "ps_pdo.php", cioè quello destinato all'elaborazione dell'input il cui codice viene proposto di seguito, per la costruzione della query SELECT o, più propriamente, per la generazione (nel nostro caso "preparazione") del template da adottare per l'eventuale selezione dei record interessati dall'istruzione: <?php if( (isset($_POST['submit'])) || (isset($_POST['cognome'])) ){ /* blocco dei parametri di connessione */ // nome di host $host = "localhost"; // nome del database $db = "nominativi"; // username dell'utente in connessione $user = "mrwebmaster"; // password dell'utente $password = "..."; /* blocco try/catch di gestione delle eccezioni */ try { // stringa di connessione al DBMS $connessione = new PDO("mysql:host=$host;dbname=$db", $user, $password); // imposto l'attributo per il report degli errori $connessione->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // definizione delle variabili per la query $contatto_cognome = $_POST['cognome']; // preparazione della query SQL $sql = $connessione->prepare("SELECT id FROM contatti WHERE cognome = :contatto_cognome"); // bind dei parametri Ing. Bianco Alessandro Pag. 21 Corso di Web design Collegio Universitario don Nicola Mazza $sql->bindParam(':contatto_cognome', $contatto_cognome, PDO::PARAM_STR, 7); // esecuzione del prepared statement $sql->execute(); // conteggio dei record coinvolti dalla query if($sql->rowCount() > 0){ // creazione di un'array contenente il risultato $result = $sql->fetchAll(); // ciclo dei risultati foreach($result as $row) { echo $row['id'] . "<br />"; } }else{ echo "Nessun record corrispondente alla richiesta."; } // chiusura della connessione $connessione = null; } catch(PDOException $e) { // notifica in caso di errore nel tentativo di connessione echo $e->getMessage(); } }else{ echo "Nessun parametro inviato dal form."; } ?> Nello specifico il file per l'elaborazione del parametro inviato attraverso il form contiene uno script al quale spetta innanzitutto il compito di verificare che l'input sia stato effettivamente inviato; superato questo controllo si potrà passare alla fase di connessione al DBMS e alla selezione del database. Il parametro ricevuto ("$_POST['cognome']") sarà quindi associato ad una variabile ("$contatto_cognome") che verrà utilizzata successivamente per il binding; fatto questo il metodo prepare() consentirà di creare il template della query, in essa l'input da passare alla clausola WHERE sarà sostituito dal placeholder "contatto_cognome" che farà da segnaposto in attesa del binding. Il binding verrà effettuato tramite il metodo bindParam() al quale saranno passati come argomenti il placeholder del template, la variabile che contiene il parametro di input, la costante PDO::PARAM_STR che vincolerà il parametro ad un tipo di dato testuale e il valore "7" che indicherà la lunghezza massima della stringa di input in termini di caratteri. Il metodo execute() si occuperà di eseguire il Prepared statement, ma la stampa dei dati eventualmente estratti tramite la SELECT avverrà soltanto in presenza di record coinvolti il cui conteggio sarà affidato al metodo rowCount(); nel caso in cui il numero di tali record dovesse essere superiore a "0" il metodo fetchAll() permetterà di accedere, tramite ciclo, ad un set di risultati iterabile da utilizzare per la stampa dei dati estratti, cioè, nel nostro caso, tutti gli "id" dei record che soddisfano la condizione introdotta con la clausola WHERE. Ing. Bianco Alessandro Pag. 22 Corso di Web design Collegio Universitario don Nicola Mazza PHP: connessione e selezione di un database con MySQLi Esaurito il discorso riguardante PDO, è possibile passare all'analisi di un'altra libreria per l'interazione tra PHP e i database come MySQLi; come anticipato, quest'ultima è stata concepita per gestire appositamente le relazioni tra applicazioni Server Side e gli archivi basati sul MySQL, essa quindi non offre un livello di astrazione indipendente dal DBMS relazionale di riferimento come nel caso di PDO. Possiede però un'interfaccia per la Programmazione Orientata agli Oggetti e supporta i Prepared statements, caratteristiche che la rendono preferibile alle classiche (ed ormai obsolete) mysql functions. L'estensione MySQLi è stata introdotta in PHP con la versione 5.0.0, mentre a partire dalla release 5.3 del linguaggio tale libreria è stata attivata e utilizza di default il MySQL Native Driver. Non è quindi richiesta alcuna ulteriore operazione per la sua abilitazione. Nell'esempio seguente viene mostrato il codice necessario per effettuare le operazioni di connessione a MySQL e per la creazione di un database tramite MySQLi, come sarà possibile notare, concettualmente la procedura prevista non differisce in modo particolare da quella descritta nel caso di PDO, esso però presenta degli aspetti peculiari che verranno affrontati subito dopo la stesura del sorgente. <?php /* creazione di un database con MySQLi. La prima operazione richiesta sarà quella relativa alla definizione del blocco dei parametri per la connessione */ // nome di host $host = "localhost"; // username dell'utente in connessione $user = "mrwebmaster"; // password dell'utente $password = "..."; // stringa di connessione al DBMS $connessione = new mysqli($host, $user, $password); // verifica su eventuali errori di connessione if ($connessione->connect_errno) { echo "Connessione fallita: ". $connessione->connect_error . "."; exit(); } // esecuzione della query per la creazione del database if (!$connessione->query("CREATE DATABASE nuova_rubrica")) { echo "Errore della query: " . $connessione->error . "."; }else{ echo "Databese creato correttamente."; } // chiusura della connessione $connessione->close(); ?> Ing. Bianco Alessandro Pag. 23 Corso di Web design Collegio Universitario don Nicola Mazza Per consentire la connessione tra applicazione e DBMS sarà necessario disporre anche in questo caso dei parametri richiesti, essi sono nel dettaglio: 1. host, cioè l'indirizzo della postazione che ospita l'installazione di MySQL, generalmente esso è "localhost" (soprattutto nel caso di script sviluppati nella macchina locale), ma può essere anche un nome di dominio o un indirizzo IP; 2. username: il nome dell'utente che possiede i permessi per effettuare operazioni che prevedano l'interazione con il DBMS e i dati da esso gestiti; 3. password: la parola chiave che l'utente precedentemente citato dovrà utilizzare per autenticarsi su MySQL. Tali informazioni potranno essere utilizzate per la creazione di una stringa di connessione rappresentata dall'istanza dell'oggetto di classe mysqli; nel caso specifico l'applicazione controlla tramite il costrutto condizionale if/else e l'utilizzo dei metodi connect_errno() e connect_error() l'eventuale verificarsi di errori in fase di connessione. Nel caso in cui si dovessero verificare dei problemi, il primo metodo restituirà il codice identificativo dell'errore prodotto dall'ultimo tentativo di connessione effettuato, mentre il secondo metterà a disposizione una stringa descrittiva dell'errore generato. Nel caso in cui, invece, non dovessero presentarsi degli errori in connessione, l'applicazione proseguirà nel suo funzionamento passando alla fase relativa alla creazione del database, chiamato nel nostro caso "nuova_rubrica", che potrà essere eseguita tramite il passaggio al metodo query() dell'istruzione SQL CREATE DATABASE seguita dal nome del database desiderato. Indipendentemente dall'esito di quest'ultimo passaggio la connessione verrà chiusa grazie all'invocazione del metodo close(). Ora che si dispone di un database su cui operare, sarà possibile passare all'istanza dell'oggetto di classe mysqli un ulteriore parametro, quello relativo al nome del database stesso; in questo modo sarà possibile ottenere un sorgente completo per la connessione e la selezione della base di dati che potrà essere salvato in un file (denominato ad esempio "connessione.php"): <?php /* Connessione al DBMS e selezione del dataabse. */ # blocco dei parametri di connessione // nome di host $host = "localhost"; // username dell'utente in connessione $user = "mrwebmaster"; // password dell'utente $password = "r5n8k6nd"; // nome del database $db = "nuova_rubrica"; # stringa di connessione al DBMS // istanza dell'oggetto della classe MySQLi $connessione = new mysqli($host, $user, $password, $db); // verifica su eventuali errori di connessione if ($connessione->connect_errno) { echo "Connessione fallita: ". $connessione->connect_error . "."; exit(); } Ing. Bianco Alessandro Pag. 24 Corso di Web design Collegio Universitario don Nicola Mazza ?> Tale file potrà essere richiamato in qualsiasi momento tramite una semplice inclusione, ciò eviterà di dover riscrivere il codice contenuto al suo interno ogni volta che esso diventi necessario per operare sul database. Creare e popolare una tabella con PHP e MySQLi Le fasi relative alla connessione con il DBMS MySQL e alla creazione di un nuovo database (denominato "nuova_rubrica") tramite la libreria MySQLi sono state affrontate nel capitolo precedente di questa trattazione; il prossimo passaggio da effettuare sarà quindi quello di generare una tabella all'interno della base di dati, tale tabella sarà poi popolata tramite dei campi destinati ad ospitare le informazioni da archiviare. Creazione di una nuova tabella MySQL Nello specifico, la procedura proposta riguarderà la creazione di una tabella contenente 3 diversi campi: 1. id: un campo autoincrementale numerico di tipo intero della lunghezza di 4 cifre destinato a fungere anche da chiave primaria; 2. nome: un campo non nullo di tipo VARCHAR, destinato quindi ad ospitare valori alfanumerici, della lunghezza massima di 30 caratteri; 3. cognome: un campo non nullo di tipo VARCHAR della lunghezza massima di 40 caratteri. Una volta definiti i campi di nostro interesse, questi potranno essere generati dopo che l'applicazione deputata a tale compito avrà effettuato la connessione a MySQL per poi selezionare il database da manipolare; come anticipato, tali operazione non dovranno essere ripetute perché già previste nel file "connessione.php" definito nel capitolo precedente e richiamato all'inizio del sorgente proposto di seguito attraverso l'istruzione include(). <?php /* generazione di una tabella con MySQLi */ // inclusione del file di connessione include "connessione.php"; // esecuzione della query per la creazione del database if (!$connessione->query("CREATE TABLE IF NOT EXISTS agenda ( id int(4) NOT NULL AUTO_INCREMENT, nome varchar(30) NOT NULL, cognome varchar(40) NOT NULL, PRIMARY KEY (id) )")) { echo "Errore della query: " . $connessione->error . "."; Ing. Bianco Alessandro Pag. 25 Corso di Web design Collegio Universitario don Nicola Mazza }else{ echo "Tabella creata correttamente."; } // chiusura della connessione $connessione->close(); ?> Nel codice presentato l'istruzione SQL necessaria per la generazione della tabella viene passata come parametro al metodo query() che, come visto in precedenza, viene utilizzato per effettuare una richiesta ("query") ad un database; in questo caso il comando SQL di riferimento è CREATE TABLE. Grazie alla clausola IF NOT EXISTS, e al fine di evitare ambiguità, l'istruzione controllerà innanzitutto che il nome scelto per la tabella desiderata (chiamata in questo caso "agenda") non sia già stato utilizzato all'interno del database "nuova_rubrica" per un'altra tabella, fatto questo e in mancanza di omonimie, si passerà alla fase relativa alla creazione dei campi. Il metodo query() è delimitato all'interno di un blocco if/else, nel caso in cui l'istruzione SQL passata come parametro ad esso dia origine ad un errore, quest'ultimo verrà intercettato attraverso il metodo error(), esso infatti avrà il compito di restituire a video una stringa destinata a descrivere la natura dell'errore prodotto in seguito alla chiamata più recente ad una funzione di MySQLi. Una volta eseguita la query al database, e indipendentemente dal risultato ottenuto, il già citato metodo close() si occuperà di chiudere la connessione al DBMS in modo da terminare il ciclo di esecuzione dello script. Se l'istruzione lanciata dovesse permettere di ottenere il risultato atteso, allora si potrà disporre di una tabella completa di campi che, a loro volta, potranno essere popolati tramite i dati. Popolare la tabella con INSERT INTO Una volta creato il database ("nuova_rubrica"), generata una tabella all'interno di esso ("agenda") con tanto di campi per la memorizzazione delle informazioni, la fase relativa all'inserimento dei dati apparirà particolarmente semplice; in questo caso infatti verrà fatto ricorso a metodi già ampiamente utilizzati in questa porzione di guida dedicata a MySQLi, a cambiare sarà invece l'istruzione SQL utilizzata. Anche per quanto riguarda la procedura di archiviazione dei dati in tabella non si potrà fare a meno di includere il file "connessione.php" (definito nel in una lezione precedente) per effettuare i passaggi relativi alla connessione al Database Manager e alla selezione del database da utilizzare; ciò avverrà quindi, come visto in precedenza, all'inizio del codice. Nel caso specifico dell'esempio proposto di seguito verranno inseriti due nuovi valori in corrispondenza dei campi "nome" e "cognome", il campo "id", essendo un autoincrementale, provvederà ad incrementarsi autonomamente e automaticamente in concomitanza con l'aggiunta dei due nuovi record. Gli approfondimenti su i diversi passaggi verranno forniti immediatamente dopo il sorgente. <?php /* inserimento di dati in una tabella con MySQLi */ // inclusione del file di connessione Ing. Bianco Alessandro Pag. 26 Corso di Web design Collegio Universitario don Nicola Mazza include "connessione.php"; // esecuzione della query per l'inserimento dei record if (!$connessione->query("INSERT INTO agenda (nome, cognome) VALUES ('Lionel', 'Messi'),('Iker', 'Casillas')")) { echo "Errore della query: " . $connessione->error . "."; }else{ echo "Inserimenti effettuati correttamente."; } // chiusura della connessione $connessione->close(); ?> Come anticipato, le novità contenute nel codice precedente non sono tantissime; sostanzialmente, dopo l'inclusione del file per la connessione al DBMS e la selezione del database verrà richiamato il già noto metodo query(). Quest'ultimo, come già più volte visto, si occuperà di eseguire un'istruzione SQL basata sul comando INSERT INTO a cui seguirà il nome della tabella coinvolta, i nomi dei campi da popolare (indicati tra parentesi tonde) e i valori da inserire introdotti tramite la clausola VALUES. Anche questa volta il metodo per l'esecuzione della query è interno ad un costrutto condizionale, infatti, grazie all'utilizzo del blocco if/else l'applicazione avrà la possibilità di controllare l'eventuale presenza di errori collegati all'esecuzione dell'istruzione SQL; il metodo error() si occuperà quindi di restituire a video una breve descrizione di tale errore nel caso in cui esso dovesse verificarsi venendo intercettato. Se non dovessero essere generati errori, lo script proseguirà nella sua esecuzione confermando l'avvenuto inserimento; vi sarà poi il passaggio alla fase di chiusura della connessione che avverrà indipendentemente dal risultato (e dal funzionamento) della query tramite l'azione del metodo close(). Anche se non particolarmente articolata, almeno per quanto riguarda il semplice caso proposto, la procedura richiesta per l'inserimento dei dati è fondamentale perché mette a disposizione delle informazioni che potranno essere estratte, aggiornate o cancellate (si ricordino i precedenti riferimenti allo schema CRUD, Create, Read, Update e Delete, per la gestione dei dati), come accadrà nei capitoli seguenti tramite l'utilizzo delle funzionalità messe a disposizione da MySQLi. Ing. Bianco Alessandro Pag. 27 Corso di Web design Collegio Universitario don Nicola Mazza Selezione dei record con PHP e MySQLi Ora che la tabella "agenda" del database "nuova_rubrica" presenta dei campi popolati con dei record, è possibile passare alla fase di estrazione dei dati con successiva stampa a video; per far questo l'applicazione basata su MySQLi proposta di seguito si occuperà di interrogare il Database Manager richiedendo l'esecuzione di una query basata sul comando SELECT. Nel caso specifico dell'esempio mostrato di seguito verranno estratti tutti i dati fino ad ora memorizzati in tabella relativamente ai campi "nome" e "cognome", ciò avverrà però soltanto dopo aver verificato tramite un apposito controllo che quest'ultima presenti effettivamente dei record. Sul modello dei codici sorgenti proposti in precedenza, anche questa volta le fasi necessarie per la connessione a MySQL e per la selezione del database coinvolto verranno effettuate attraverso il file "connessione.php" che verrà richiamato all'inizio dello script tramite un'inclusione. <?php /* selezione di dati da una tabella con MySQLi */ // inclusione del file di connessione include "connessione.php"; // esecuzione della query per la selezione dei record // query argomento del metodo query() if (!$result = $connessione->query("SELECT nome,cognome FROM agenda")) { echo "Errore della query: " . $connessione->error . "."; exit(); }else{ // conteggio dei record if($result->num_rows > 0) { // conteggio dei record restituiti dalla query while($row = $result->fetch_array(MYSQLI_ASSOC)) { echo $row['nome'] ." ". $row['cognome'] . "<br />"; } // liberazione delle risorse occupate dal risultato $result->close(); } } // chiusura della connessione $connessione->close(); ?> Come già accaduto in precedenza, anche nell'esempio appena mostrato l'istruzione per l'interrogazione al DBMS è stata passata come argomento al metodo query(); nel caso in cui tale operazione dovesse dare luogo a degli errori, allora il metodo error() consentirà di stampare a video una stringa descrittiva riguardante la natura dell'errore stesso. Il verificarsi di un errore interromperà l'esecuzione dello script grazie alla funzione exit(), in caso contrario, cioè se la query dovesse essere eseguita correttamente, l'applicazione richiamerà il metodo num_rows() che avrà il compito di contare i record coinvolti da quest'ultima. Nel caso in cui il conteggio effettuato dovesse restituire un risultato superiore a zero: if($result->num_rows > 0) { ... Ing. Bianco Alessandro Pag. 28 Corso di Web design Collegio Universitario don Nicola Mazza allora si potrà passare alla fase di stampa dei dati estratti; essa sarà possibile tramite un ciclo while le cui iterazioni saranno pari al numero dei record selezionati tramite l'istruzione SQL. Per ogni iterazione del ciclo verrà richiamato il metodo fetch_array(), esso è stato concepito per riportare un set di risultati sotto forma di array associativo, numerico o dotato di entrambe tali caratteristiche; a tal proposito è disponibile un apposito parametro sotto forma di costante in grado di definire quale tipo di array dovrà essere prodotto tramite l'esecuzione del metodo. Tale parametro potrà assumere tre diversi valori: MYSQLI_ASSOC (array associativo, come nel caso dell'esempio proposto), MYSQLI_NUM (array numerico) o MYSQLI_BOTH (entrambe le caratteristiche). Il ciclo consentirà quindi di stampare uno per uno tutti i record estratti prelevandoli direttamente dall'array generato (nel nostro caso denominato "$row"), i valori restituiti a video saranno quelli corrispondenti alle chiavi associative utilizzate ($row['nome] e $row['cognome']). Fatto questo il metodo close() permetterà di liberare le risorse impiegate per la memorizzazione del risultato ottenuto e di interrompere la connessione a MySQL. Aggiornamento e cancellazione di record con MySQLi Una volta inseriti dei record all'interno della tabella "agenda", le informazioni archiviate in essa potranno essere aggiornate (e quindi modificate) o cancellate. Per fare ciò faremo ricorso, rispettivamente, alle istruzioni SQL UPDATE e DELETE. Modificare un record con MySQLi A tal proposito, nel codice che verrà proposto di seguito saranno eseguite nell'ordine due operazioni distinte: la prima riguarderà appunto l'aggiornamento di alcuni dei dati precedentemente memorizzati, la seconda consisterà nell'estrazione del record coinvolto dall'UPDATE (ma potrebbero essere più di uno) tramite query SELECT e nella successiva stampa a video delle informazioni modificate: <?php /* upgrade di un record in una tabella con MySQLi */ // inclusione del file di connessione include "connessione.php"; // esecuzione della query per l'aggiornamento dei record if (!$connessione->query("UPDATE agenda SET nome='Lio' WHERE id=1")) { echo "Errore della query UPDATE: " . $connessione->error . "."; exit(); }else{ // esecuzione della query per la selezione dei record // query argomento del metodo query() Ing. Bianco Alessandro Pag. 29 Corso di Web design Collegio Universitario don Nicola Mazza if (!$result = $connessione->query("SELECT nome,cognome FROM agenda WHERE id=1")) { echo "Errore della query: " . $connessione->error . "."; exit(); }else{ // conteggio dei record if($result->num_rows > 0) { // ciclo i record restituiti dalla query while($row = $result->fetch_array(MYSQLI_ASSOC)) { echo $row['nome'] ." ". $row['cognome'] . "<br />"; } // liberazione delle risorse occupate dal risultato $result->close(); } } } // chiusura della connessione $connessione->close(); ?> Chiaramente, il primo passaggio da eseguire sarà quello relativo all'inclusione del file che contiene il codice necessario per la connessione al Database engine e la selezione del database ("config.php"); fatto questo si potrà lanciare immediatamente l'istruzione per l'aggiornamento del record che si desidera modificare: "UPDATE agenda SET nome='Lio' WHERE id=1" Tale istruzione verrà passata come argomento al metodo query() che si occuperà di eseguirla, nel caso in cui questa procedura dovesse dar luogo ad errori o comportamenti imprevisti, il metodo error() permetterà di visualizzare una notifica, prodotta da PHP stesso, indicante la natura dell'eccezione che dovrà essere gestita. In presenza di errori, la funzione exit(), inserita come esito vincolante in caso di soddisfazione della condizione prevista nel costrutto di controllo if/else, impedirà che le istruzioni successive vengano eseguite. Nel caso in cui l'UPDATE dovesse invece concludersi con successo, il metodo num_rows() si occuperà di verificare che i record coinvolti dall'aggiornamento siano in numero maggiore a zero; un risultato pari a uno o superiore permetterà di lanciare un ciclo while che, per ogni sua iterazione, consentirà di richiamare il metodo fetch_array() con cui prelevare l'array associativo ($row) contenente le informazioni da restituire a video. Al metodo fetch_array() verrà passato un parametro associato al valore MYSQLI_ASSOC che, come indicato nel capitolo precedente, permetterà di definire quale tipo di array dovrà essere prodotto dall'esecuzione del metodo. Una volta effettuate le operazioni richieste, il metodo close() consentirà di liberare le risorse occupate dal risultato della SELECT e di terminare la connessione al DBMS MySQL. Ing. Bianco Alessandro Pag. 30 Corso di Web design Collegio Universitario don Nicola Mazza Cancellare un record con MySQLi Come anticipato nell'analisi della libreria PDO, i dati di una tabella contenuta in un database possono essere cancellati tramite delle istruzioni SQL esattamente come possono esseri inseriti, estratti o modificati; anche in questo caso vale la pena ricordare che l'eliminazione di un record precedentemente archiviato rappresenta un'operazione definitiva, irreversibile: MySQL infatti non prevede un sistema per mantenere in memoria le informazioni rimosse. Il comando SQL di riferimento per eseguire questo tipo di procedura è naturalmente DELETE FROM, ad esso andrà passato come argomento il nome della tabella coinvolta (nel caso del nostro esempio "agenda"), mentre la clausola WHERE permetterà di definire il record coinvolto o più record nel caso in cui si voglia procedere ad un maggior numero di cancellazioni. <?php /* cancellazione di un record da una tabella con MySQLi */ // inclusione del file di connessione include "connessione.php"; // esecuzione della query per la selezione dei record if (!$result = $connessione->query("DELETE FROM agenda WHERE id=1")) { echo "Errore della query: " . $connessione->error . "."; exit(); } // liberazione della memoria dai risultati estratti $result->close(); // chiusura della connessione $connessione->close(); ?> Come per qualsiasi altra operazione a carico del DBMS, anche in questo caso la fase relativa alla connessione a MySQL e quella riguardante la selezione del database dovranno precedere qualsiasi altra istruzione; motivo per il quale il primo passaggio da eseguire sarà quello di includere il file "config.php" contenente il codice necessario a questo scopo. Fatto ciò si potrà procedere con l'esecuzione dell'istruzione SQL che, nel caso specifico, verrà effettuata a carico del record associato all'identificatore univoco ("id") "1": "DELETE FROM agenda WHERE id=1" Tale istruzione verrà introdotta all'interno di una struttura di controllo if/else, quest'ultima in pratica prevede che nel caso in cui il comando lanciato non possa essere eseguito, a causa di un errore nella sintassi o di un malfunzionamento, il metodo error() dovrà occuparsi di inviare una breve segnalazione in grado di descrivere la natura della problematica eventualmente verificatasi. Il già citato metodo exit() consentirà poi all'applicazione di arrestarsi in modo che alla generazione di un errore non faccia seguito alcuna esecuzione successiva. In assenza di errori, l'istruzione lanciata avrà avuto plausibilmente esito positivo, motivo per il quale si potrà procedere con la chiamata al metodo close() attraverso il quale liberare le risorse impegnate e terminare la connessione al Database engine. Ing. Bianco Alessandro Pag. 31 Corso di Web design Collegio Universitario don Nicola Mazza I Prepared Statements in MySQLi Il funzionamento dei Prepared Statements è stato ampiamente descritto nella parte di questa trattazione dedicata all'utilizzo dell'estensione PDO di PHP; riassumendo quanto anticipato, è possibile dire che tali costrutti rappresentano una modalità per rendere più sicure e performanti le operazioni che prevedono un'interazione tra un'applicazione e una base di dati. Dal punto di vista della sicurezza essi non consentono l'esecuzione diretta delle istruzioni basate sul linguaggio SQL, più propriamente i Prepared Statements "preparano" dei template ai quali passare i dati coinvolti; la separazione tra dati ed istruzioni impedirà quindi l'esecuzione di codice malevolo, come per esempio quello impiegato per le SQL Injections. Relativamente alle prestazioni, le istruzioni parametrizzate funzionano sulla base di schemi, i già citati template, che potranno essere riutilizzati senza la necessità che vengano ridefiniti, ciò rappresenta un vantaggio sia per quanto riguarda l'ottimizzazione dei sorgenti che in riferimento ai tempi necessari per la sua stesura. Per evitare noiose ripetizioni sarà possibile proporre un semplice esempio pratico di Prepared Statements in MySQLi; a tale scopo si potrà definire un form destinato ad inviare un parametro di input che dovrà essere raccolto ed elaborato da un'applicazione PHP: <form action="ps_mysqli.php" method="POST"> Scegli un valore nel campo sottostante:<br /> <input type="number" name="identificatore" min="1" max="10" step="1" value="1"><br/> <input type="submit" value="Invia"> </form> Il modulo creato sarà quindi associato alla seguente applicazione (contenuta nel file "ps_mysqli.php") che effettuerà un'estrazione dalla tabella "agenda" sulla base del parametro ricevuto: <?php /* uso dei prepared statements per l'estrazione di dati con MySQLi */ if(isset($_POST['submit']) || isset($_POST['identificatore'])){ // inclusione del file di connessione include "connessione.php"; // preparazione della query per la selezione dei record $stmt = $connessione->prepare("SELECT nome, cognome FROM agenda WHERE id=?"); // definizione della variabile per la sostituzione del placeholder $stmt->bind_param("i", $id); // valorizzazione della variabile per l'esecuzione $id = $_POST['identificatore']; $stmt->execute(); // estrazione dei risultati $result = $stmt->get_result(); Ing. Bianco Alessandro Pag. 32 Corso di Web design Collegio Universitario don Nicola Mazza // conteggio dei record if ($result->num_rows > 0) { while ($row = $result->fetch_array(MYSQLI_ASSOC)) { echo $row['nome'] ." ". $row['cognome']; } }else{ echo "Nessun dato presente per l'Id selezionato."; } // chiusura dello statement $stmt->close(); // chiusura della connessione $connessione->close(); }else{ echo "Nessun parametro inviato dal form."; } ?> Dopo aver incluso il file "config.php" per la connessione a MySQL e la selezione del database, si potrà passare alla fase per la realizzazione del template, come sarà possibile notare esso verrà introdotto dal metodo prepare() e presenterà una sintassi simile a quella di un'istruzione SQL: "SELECT nome,cognome FROM agenda WHERE id=?" A caratterizzare il template è però la presenza di un simbolo ("?") utilizzato al posto del parametro che dovrà essere passato alla clausola WHERE; tale simbolo prende il nome di placeholder o "segnaposto". I Prepared Statement in MySQLi prevedono il binding dei parametri, ciò significa che il placeholder precedentemente introdotto verrà vincolato ad una variabile, passata al metodo bind_param(), della quale dovrà essere indicato il tipo di dato. Nel caso specifico del nostro esempio avremo come variabile $id ed essa verrà associata ad un tipo di dato numerico intero simboleggiato dal parametro "i": $stmt->bind_param("i", $id); in alternativa sarà possibile utilizzare: "d": per variabili associate al tipo di dato double; "s": per variabili con tipo di dato string; "b": "blob", per dati in formato binario. Una volta stabilita la variabile per il binding, quest'ultima sarà finalmente associabile al parametro inviato dal form ("$_POST['identificatore']"), fatto questo il metodo execute() permetterà di eseguire la query preparata tramite il template mentre get_result() renderà disponibile il risultato di tale esecuzione. Fatto questo sarà possibile utilizzare il metodo num_rows() per controllare il numero dei record coinvolti dalla query, se questo dovesse essere superiore a zero si potrà utilizzare il metodo fetch_array() all'interno di un ciclo che permetterà di iterare l'array contenente i risultati. Una volta stampati questi ultimi, il metodo close() consentirà di liberare le risorse occupate e di chiudere la connessione. Ing. Bianco Alessandro Pag. 33 Corso di Web design Collegio Universitario don Nicola Mazza MySQL functions: connessione, creazione database e tabella, selezione del database Come anticipato, a partire dalla versione 5.5 di PHP le MySQL functions sono state classificate come ufficialmente deprecate, ciò significa che utilizzandole lo sviluppatore riceverà una notifica dal motore del linguaggio in fase di esecuzione che ne sconsiglierà l'adozione. Ciò però non significa che tali costrutti possano essere definitivamente ignorati. Le MySQL functions, infatti, non sono da ritenersi deprecate perché inadeguate a svolgere il compito per il quale sono state concepite, ma per il fatto di non disporre di un'interfaccia nativa per la programmazione ad oggetti e per non fornire il supporto per i Prepared Statements. Detto questo, milioni di siti Web funzionano ancora oggi senza alcun problema sulla base di esse. Conoscere le MySQL functions significa quindi poter intervenire sulle numerose applicazioni che tuttora le impiegano, motivo per il quale questa trattazione si concluderà con una loro analisi dettagliata ma fortemente orientata all'utilizzo pratico. Per motivazioni "storiche", quindi, ritengo opportuno accennare, nella parte conclusiva della nostra guida, a queste funzioni invitando tuttavia il lettore ad orientarsi sui costrutti analizzati nelle precedenti lezioni. Connessione al DBMS Per effettuare una connessione al Database engine MySQL tramite le MySQL functions è possibile utilizzare la funzione mysql_connect() alla quale passare i seguenti parametri: host: il nome della macchina ospitante il DBMS, questo dato potrebbe essere un nome di dominio così come un indirizzo IP, ma nella maggior parte dei casi (soprattutto nelle installazioni locali) è "localhost"; user: è il nome dell'utente abilitato ad interagire con il Database manager; password: è la credenziale necessaria per l'autenticazione dell'utente in connessione. Tali informazioni dovranno essere passate alla funzione nell'ordine evidenziato dall'esempio seguente: <?php /* connessione a MySQL con le MySQL functions */ //creazione dell'handle di connessione $connessione = mysql_connect("localhost", "mrwebmaster", "...") or die ("Impossibile connettersi a MySQL: " . mysql_error()); // chiusura della connessione mysql_close($connessione); ?> Una volta stabilita la connessione, se non dovessero essere necessarie ulteriori operazioni a carico del DBMS, si potrà chiuderla tramite la funzione mysql_close() alla quale passare come parametro la variabile handle associata ad essa (nel nostro caso "$connessione"). Ing. Bianco Alessandro Pag. 34 Corso di Web design Collegio Universitario don Nicola Mazza Creazione di un database e di una tabella L'esempio seguente mostra come in poche righe di codice si possano eseguire numerose procedure; nell'ordine infatti abbiamo: la connessione a MySQL, la creazione del database, la selezione di quest'ultimo, la creazione e il popolamento di una tabella nonché la chiusura della connessione. <?php /* creazione di un database e di una tabella con le MySQL functions */ // connessione al DBMS $connessione = mysql_connect("localhost", "mrwebmaster", "...") or die ("Impossibile connettersi a MySQL: " . mysql_error()); // creazione del database $creazione_db = mysql_query("CREATE DATABASE elenco_utenti") or die ("Impossibile creare il database: " . mysql_error()); // selezione del database $selezione_db = mysql_select_db("elenco_utenti") or die ("Impossibile selezionare il database: " . mysql_error()); // creazione della tabella $creazione_tb = mysql_query("CREATE TABLE nominativi ( id_utente INT(4) NOT NULL AUTO_INCREMENT, nome_utente VARCHAR(30) NOT NULL, cognome_utente VARCHAR(40) NOT NULL, email_utente VARCHAR(255) NOT NULL, PRIMARY KEY (id_utente))") or die ("Impossibile creare la tabella: " . mysql_error()); // chiusura della connessione mysql_close($connessione); ?> La fase di connessione verrà effettuata tramite la già citata funzione mysql_connect() mentre si farà ricorso a mysql_query() per la creazione del database; a questa funzione verrà passata come argomento un'istruzione SQL di tipo CREATE DATABASE alla quale associare il nome dell'archivio desiderato. Una volta creato il database (nel nostro caso "elenco_utenti"), il nome di quest'ultimo potrà essere selezionato tramite la funzione mysql_select_db() che lo accetterà come parametro. Fatto questo si potrà procedere con la creazione della tabella ("nominativi") che presenterà in tutto 4 campi: "id_utente", numerico intero non nullo e autoincrementale della lunghezza di massimo 4 cifre, seguito da "nome_utente", "cognome_utente" e "email_utente", tutti VARCHAR non nulli rispettivamente della lunghezza massima di 30, 40 e 255 caratteri. Anche la query per la creazione della tabella verrà eseguita tramite la funzione mysql_query() che la accetterà come parametro e, una volta completata tale operazione, si potrà chiudere la connessione con mysql_close(). Da notare l'impiego del già utilizzato mysql_error() per la segnalazione di eventuali errori prodotti durante l'interazione con il DBMS: Ing. Bianco Alessandro Pag. 35 Corso di Web design Collegio Universitario don Nicola Mazza Creare il file di selezione e connessione Ora che, sappiamo come connettere un'applicazione a MySQL, abbiamo creato un database e descritto la procedura corretta per la sua selezione, potremo creare un file riutilizzabile che ci permetta di non dover riscrivere le fasi di connessione e selezione ogni volta che queste dovessero essere richieste. <?php /* connessione al DBMS e selezione del database con le MySQL functions */ // connessione al DBMS $connessione = mysql_connect("localhost", "mrwebmaster", "...") or die ("Impossibile connettersi a MySQL: " . mysql_error()); // selezione del database $selezione_db = mysql_select_db("elenco_utenti") or die ("Impossibile selezionare il database: " . mysql_error()); ?> Il codice appena proposto potrà essere salvato all'interno di un file, denominato per esempio "connessione.php", che sarà richiamabile all'interno di uno script PHP attraverso la già nota funzione include(). Ing. Bianco Alessandro Pag. 36 Corso di Web design Collegio Universitario don Nicola Mazza MySQL functions: inserimento, selezione e lettura dei dati Una volta effettuate le fasi di connessione al DBMS, creazione e selezione del database, generazione della tabella e popolamento di quest'ultima tramite i campi desiderati, si potranno eseguire le classiche operazioni previste dal già citato schema CRUD per l'inserimento, la lettura, l'aggiornamento e la cancellazione dei dati. Inserimento dei dati in tabella Dopo aver incluso il file per la connessione a MYSQL e la selezione della base di dati, sarà possibile inserire dei dati nei campi della tabella passando una query basata sul comando INSERT INTO alla funzione mysql_query(), destinata all'esecuzione delle istruzioni SQL. <?php /* inserimento di dati con le MySQL functions */ include "connessione.php"; // query per l'inserimento $query = "INSERT INTO nominativi (nome_utente, cognome_utente, email_utente) VALUES ('Homer', 'Simpson', '[email protected]')"; // inserimento dei dati $esecuzione_query = mysql_query($query) or die ("Impossibile inserire i dati: " . mysql_error()); // chiusura della connessione mysql_close($connessione); ?> Ad INSERT INTO seguiranno i nomi dei campi coinvolti e i valori da inserire all'interno di essi; se dovessero verificarsi degli errori la funzione mysql_error() si occuperà di segnalarli, in caso contrario la query potrà considerarsi eseguita e la funzione mysql_close() chiuderà la connessione effettuata. Recupero dei dati selezionati con mysql_fetch_row() I dati inseriti in tabella potranno essere ora estratti e stampati a video; per far questo le MySQL functions offrono diverse soluzioni, tutte ugualmente valide ma caratterizzate da piccole differenze. Il primo caso che verrà trattato sarà quello della funzione mysql_fetch_row(), essa restituisce un recordset di risultati, prodotti dall'esecuzione di un'istruzione passata come argomento alla funzione mysql_query(), all'interno di un array dotato di indici numerici. Un semplice esempio riguardante il loro utilizzo potrebbe essere concepito in questo modo: <?php /* estrazione di dati dalla tabella */ // inclusione del file per la connessione e la selezione del database Ing. Bianco Alessandro Pag. 37 Corso di Web design Collegio Universitario don Nicola Mazza include "connessione.php"; // query per la selezione dei dati $query = mysql_query("SELECT nome_utente, cognome_utente, email_utente FROM nominativi") or die ("Impossibile eseguire la query: " . mysql_error()); // controllo sul numero dei record coinvolti if (mysql_num_rows($query) > 0){ // ciclo per l'estrazione dei risultati while ($row = mysql_fetch_row($query)) { echo "Nome: " . $row[0] . " Cognome: " . $row[1] . " Email: " . $row[2] . "<br>"; } } // liberazione dai risultati in memoria mysql_free_result($query); // chiusura della connessione mysql_close($connessione); ?> Ecco perché per stampare a video tramite il ciclo while i valori estratti in seguito alla SELECT verranno utilizzati quale riferimento degli indici numerici (nel nostro esempio da "0" a "2"). E' possibile utilizzare mysql_fetch_row() anche al di fuori di un ciclo, ma sarà possibile ricorrere a tale alternativa soltanto nel caso in cui si voglia estrarre un singolo record. Da notare l'utilizzo della funzione mysql_free_result() che consentirà di liberare le risorse occupate in seguito all'esecuzione della query SELECT. Recupero dei dati selezionati con mysql_fetch_assoc() La funzione mysql_fetch_assoc() restituisce un recordset di risultati all'interno di un array associativo ed è in questo particolare che essa si differenzia da mysql_fetch_row() che invece fa riferimento ad un array di tipo numerico. Sulla base di tale caratteristica è possibile modificare in questo modo la parte relativa all'estrazione dei dati tramite ciclo while dell'esempio precedente: while ($row = mysql_fetch_assoc($query)) { echo "Nome: " . $row['nome_utente'] . " Cognome: " . $row["cognome_utente"] . " Email: " . $row["email_utente"] . "<br>"; } La logica applicativa è in linea di massima la stessa, cambia invece, oltre alla funzione utilizzata, anche la modalità adottata per la stampa a video, dove ogni valore diverrà disponibile grazie all'indice associativo assegnato ad esso che, nel caso specifico, sarà il nome del campo in cui è stato memorizzato, Ing. Bianco Alessandro Pag. 38 Corso di Web design Collegio Universitario don Nicola Mazza Recupero dei dati selezionati con mysql_fetch_array() La funzione mysql_fetch_array() modificherà il suo comportamento in base al secondo parametro che le viene passato come argomento, il primo sarà ancora una volta il risultato dell'applicazione di mysql_query() sulla query SELECT. Il secondo parametro potrà assumere tre diversi valori: MYSQL_ASSOC: restituisce un recordset di risultati all'interno di un array associativo (come in mysql_fetch_assoc()); MYSQL_NUM: restituisce un recordset di risultati all'interno di un array indicizzato numericamente (come in mysql_fetch_row()); MYSQL_BOTH: restituisce un recordset di risultati all'interno di un array dotato di indici numerici e associativi. Quello previsto per il terzo valore è in pratica il comportamento predefinito in caso di mancata indicazione del secondo parametro, motivo per il quale sarà possibile ottenere un risultato comunque corretto stampando i dati selezionati con un'istruzione del genere basata sugli indici numerici: while ($row = mysql_fetch_array($query)) { echo "Nome: " . $row[0] . " Cognome: " . $row[1] . " Email: " . $row[2] . "<br>"; } così come utilizzando il seguente formato basato sugli indici associativi: while ($row = mysql_fetch_array($query)) { echo "Nome: " . $row['nome_utente'] . " Cognome: " . $row["cognome_utente"] . " Email: " . $row["email_utente"] . "<br>"; } Recupero dei dati selezionati con mysql_fetch_object() La funzione mysql_fetch_object() restituisce un recordset di risultati all'interno di un oggetto le cui proprietà corrisponderanno ai campi del record, la sua peculiarità rispetto ai tre costrutti analizzati in precedenza risulta quindi immediatamente evidente per via del fatto che in questo caso i risultati non sono contenuti in un array. Anche in questo caso, l'estrazione dei dati viene effettuata attraverso un ciclo, come nell'esempio proposto di seguito: while ($obj = mysql_fetch_object($query)) { echo "Nome: " . $obj->nome_utente . " Cognome: " . $obj->cognome_utente . " Email: " . $obj->email_utente . "<br>"; } Ing. Bianco Alessandro Pag. 39 Corso di Web design Collegio Universitario don Nicola Mazza Per ogni iterazione del ciclo i valori selezionati verranno stampati a video in quanto associati alle diverse proprietà dell'oggetto che corrisponderanno ai nomi dei campi coinvolti. MySQL functions: aggiornamento e cancellazione dei dati I dati selezionabili e leggibili sono per loro natura anche dati "disponibili", motivo per il quale essi potranno essere aggiornati e cancellati tramite apposite istruzioni basate sui comandi SQL. Per quanto riguarda le procedure di modifica dei dati, queste dovranno essere basate sul comando UPDATE seguito dal nome della tabella coinvolta (nel nostro caso "nominativi"), dalla clausola SET, che introdurrà i campi i cui valori dovranno essere modificati e i valori necessari per la modifica, e infine dalla seconda clausola WHERE con cui determinare quale (o quali) record dovrà essere coinvolto nell'operazione. Nel caso specifico della tabella utilizzata per i nostri esempi tali passaggi saranno riassumibili tramite la seguente istruzione: "UPDATE nominativi SET nome_utente = 'Bart', email_utente = '[email protected]' WHERE id_utente = 1" Quest'ultima dovrà essere passata come parametro alla funzione mysql_query() che si occuperà di eseguirla; tale funzione verrà poi immediatamente richiamata per eseguire una seconda query, cioè la SELECT con cui estrarre i valori che sono stati aggiornati grazie al precedente UPDATE. Fatto questo non rimarrà che recuperare i risultati della query in modo che divengano stampabili a video. ciò sarà possibile attraverso l'utilizzo della funzione mysql_fetch_array(); nell'esempio seguente, se mysql_num_rows() dovesse rilevare che i record coinvolti dalla SELECT sono in numero maggiore a zero, essa verrà impiegata all'interno di un ciclo che ad ogni iterazione stamperà i valori disponibili sulla base degli indici associativi (in pratica i campi di appartenenza) relativi ad essi. <?php /* aggiornamento dei dati in tabella */ // inclusione del file per la connessione e la selezione del database include "connessione.php"; // query per l'aggiornamento dei dati $query_update = mysql_query("UPDATE nominativi SET nome_utente = 'Bart', email_utente = '[email protected]' WHERE id_utente = 1") or die ("Impossibile eseguire la query: " . mysql_error()); // query per la selezione dei dati $query_select = mysql_query("SELECT nome_utente, cognome_utente, email_utente FROM nominativi") or die ("Impossibile eseguire la query: " . mysql_error()); // controllo sul numero dei record coinvolti if (mysql_num_rows($query_select) > 0){ // ciclo per l'estrazione dei risultati Ing. Bianco Alessandro Pag. 40 Corso di Web design Collegio Universitario don Nicola Mazza while ($row = mysql_fetch_array($query_select)) { echo "Nome: " . $row['nome_utente'] . " Cognome: " . $row["cognome_utente"] . " Email: " . $row["email_utente"] . ".\n"; } } // liberazione dai risultati in memoria mysql_free_result($query_select); // chiusura della connessione mysql_close($connessione); ?> Una volta ottenuto il risultato desiderato sarà possibile liberare le risorse occupate in seguito alla SELECT grazie alla funzione mysql_free_result(), mentre mysql_close() chiuderà la connessione al DBMS. Il codice necessario per la rimozione di uno o più record è particolarmente semplice, esso in pratica si baserà sull'esecuzione tramite la funzione mysql_query() di un'istruzione SQL basata sul comando DELETE FROM seguito dal nome della tabella coinvolta (anche in questo caso "nominativi") e da una clausola WHERE che consentirà di definire con precisione il record interessato dalla cancellazione. <?php /* cancellazione dei dati in tabella */ // inclusione del file per la connessione e la selezione del database include "connessione.php"; // query per la cancellazione dei dati $query_delete = mysql_query("DELETE FROM nominativi WHERE id_utente = 1") or die ("Impossibile eseguire la query: " . mysql_error()); // chiusura della connessione mysql_close($connessione); ?> Una volta eseguita l'istruzione prevista, se la funzione mysql_error() non dovesse segnalare alcun errore sintattico o malfunzionamento l'eliminazione potrà considerarsi effettuata e mysql_close() provvederà alla chiusura della connessione. Come anticipato nella descrizione delle medesime procedure affrontate tramite i costrutti di PDO e MySQLi, si ricorda che le operazioni di aggiornamento e cancellazione a carico dei dati archiviati in un database MySQL sono irreversibili e quindi, una volta effettuate, non potranno essere annullate. Ing. Bianco Alessandro Pag. 41