Corso di Web design Collegio Universitario don Nicola Mazza

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