Prof. Paolo Latella – I.T.E. A. Bassi di Lodi
Laboratorio di Informatica Triennio Programmatori Mercurio e Sistemi Informativi
Aziendali
Email: [email protected]
Blog: http://paololatella.blogspot.com
Data lezione: 21 ottobre 2011
MySql -Lezione sui Database
Copyright: © Claudio Curci
Vietata la copia e la distribuzione, anche parziale,
senza la previa autorizzazione scritta di © Andrea Bianchi
fonte: http://www.web-link.it
Introduzione ai database relazionali
Il Database
Eccoci finalmente giunti alla tanto attesa lezione sui database. Un database è una raccolta
organizzata di informazioni. Pensiamo al mitico album Panini: quale migliore esempio per
illustrare il concetto di base dati! Ogni squadra due pagine (ormai sono diventate
quattro!!!), per ciascun giocatore fotografia e scheda personale.
In informatica, all'inizio, i database erano davvero simili all'album Panini: semplici file di
testo dai quali attingere informazioni spesso disordinate. Era necessario scrivere
programmi che stabilissero un separatore di risultati (è il caso del formato "comma
separeted value" che potete ottenere salvando un foglio excel con estensione .csv).
Vennero poi i database, file strutturati e capaci di estrarre informazioni ordinate. Esistono
diversi tipi di database, è possibile però eseguire interrogazioni su tutti con un linguaggio
(quasi) standard: SQL.
I database relazionali rappresentano l'ultima generazione di raccolta dati. Pensiamo di
gestire l'elenco di tutti i calciatori del nostro campionato, con presenze e gol divisi squadra
per squadra.
Prima dei db relazionali avremmo avuto un'unica, grande, tabella di questo tipo:
nome_giocatore;
anno_nascita;
ruolo;
squadra;
anno;
presenze;
gol
Un approccio del genere è problematico per diversi motivi. Innanzitutto, la ridondanza
delle informazioni. Pensate il caso di Franco Causio, ad esempio: avrà giocato quasi 25
anni (!!!), in 9 squadre diverse. Ci troveremmo a scrivere 25 volte lo stesso nome-cognome,
la stessa data di nascita, lo stesso ruolo, e parecchie volte la stessa squadra (11 anni la
Juventus).
Un inutile spreco di byte, nonchè una "sconfitta" logica: perchè obbligare il computer a
ricordare delle informazioni uguali?
Ipotizziamo poi di trovare dati da cambiare. In questo esempio non è possibile, ma in altri
ambiti può accadere di dover aggiornare dei dati. Anzi.. anche in questo caso ci saremmo
trovati a cambiare delle statistiche: pensate al caso di Luciano, il calciatore del Chievo che
un bel giorno ci fece la sorpresa di chiamarsi invece.. Eriberto, e di essere nato perfino in
altra data! Con una megatabella strutturata nel modo precedente, avremmo dovuto
ricercare a manina tutti i dati di tal Eriberto e, sempre a manina, cambiare il nome in
Luciano!
Oltretutto, va bene che i computer moderni sono dei mostri se paragonati a quelli di anni
fa, ma i tempi richiesti per scorrere una tabella nella ricerca di informazioni possono
comunque essere elevati. Pensate in una pagina web, dove i tempi di risposta sono già
compromessi di loro a causa della lentezza della linea telefonica, cosa significherebbe
aggiungere qualche secondo in più in attesa di una risposta da un'interrogazione ad un
database.
I database relazionali rappresentarono una svolta nell'informatica. La tabella precedente
sarebbe stata strutturata in questo modo:
-tabella giocatori:
id_giocatore
nome_giocatore
anno_nascita
ruolo
-tabella squadre:
id_squadra
nome_squadra
-tabella squadre_giocatori:
id_giocatore
id_squadra
anno
presenze
gol
Come vedete, è stato possibile scorporare i dati in 3 tabelle, due (giocatori e squadre) per
raggruppare dati ridondanti e una (squadre_calciatori) per le informazioni univoche. In un
database relazionale non dovrebbero esistere ripetizioni. Ecco perchè abbiamo
raggruppato anche le squadre in una tabella a sè.
Avrete già notato che per le due tabelle contenente informazioni univoche (giocatori e
squadre), abbiamo anche inserito un nuovo campo: id, ovvero l'identificatore (o campo
chiave). E' un campo numerico grazie al quale potremo mettere in relazione (parliamo di
db relazionali) i campi comuni a più tabelle.
Passiamo ad un esempio pratico per chiarire meglio il concetto: vediamo come potrebbe
essere strutturato un database con i dati di carriera di Franco Causio, sia in un approccio
"vecchia maniera", sia in un db relazionale.
Prendo come base l'Almanacco Panini 1987 (quindi dati aggiornati fino al 1985-86
incluso).
Approccio "vecchia maniera"
tabella calciatori (unica tabella della base dati)
nome_giocatore
anno_nascita
ruolo
squadra
anno
presenze
gol
Franco Causio
1/2/1949
Alainterno
Lecce
196465
3
0
Franco Causio
1/2/1949
Alainterno
Sambenedettese
196566
13
0
Franco Causio
1/2/1949
Alainterno
Juventus
196667
0
0
Franco Causio
1/2/1949
Alainterno
Juventus
196768
1
0
Franco Causio
1/2/1949
Alainterno
Reggina
196869
30
5
Franco Causio
1/2/1949
Alainterno
Palermo
196970
22
3
Franco Causio
1/2/1949
Alainterno
Juventus
197071
20
6
Franco Causio
1/2/1949
Alainterno
Juventus
197172
30
6
Franco Causio
1/2/1949
Alainterno
Juventus
197273
28
8
Franco Causio
1/2/1949
Ala-
Juventus
1973-
28
2
interno
74
Franco Causio
1/2/1949
Alainterno
Juventus
197475
28
7
Franco Causio
1/2/1949
Alainterno
Juventus
197576
29
5
Franco Causio
1/2/1949
Alainterno
Juventus
197677
30
5
Franco Causio
1/2/1949
Alainterno
Juventus
197778
30
3
Franco Causio
1/2/1949
Alainterno
Juventus
197879
30
1
Franco Causio
1/2/1949
Alainterno
Juventus
197980
26
4
Franco Causio
1/2/1949
Alainterno
Juventus
198081
25
2
Franco Causio
1/2/1949
Alainterno
Udinese
198182
26
5
Franco Causio
1/2/1949
Alainterno
Udinese
198283
27
3
Franco Causio
1/2/1949
Alainterno
Udinese
198384
30
3
Franco Causio
1/2/1949
Alainterno
Inter
198485
24
0
Franco Causio
1/2/1949
Alainterno
Lecce
198586
26
3
Se qualcuno di voi non ha ancora capito la differenza tra un database relazionale ed uno
tradizionale, bhè provi a ricopiare la tabella qui sopra (non un "CTRL-C/CTRL-V") ma un
"copia a manina") e capirà cosa vuol dire scrivere più di 20 volte la stessa cosa grrrr
Prendiamo invece la stessa situazione, gestita con un db relazionale:
tabella giocatori:
id_giocatore nome_giocatore anno_nascita ruolo
Ala1
Franco Causio 1/2/1949
interno
tabella squadre:
id_squadra
nome_squadra
1
Ascoli
2
Atalanta
3
Avellino
4
Brescia
per non perdere 1 Mega di codice e 1 Ora di
tempo, da adesso in poi inserisco solo le
squadre utili al nostro esempio
14
Inter
30
Juventus
44
Lecce
61
Palermo
70
Reggina
84
Sambenedettese
94
Triestina
100
Udinese
tabella squadre_giocatori:
id_giocatore
id_squadra
anno
presenze
gol
1
44
196465
3
0
1
84
196566
13
0
1
30
196667
0
0
1
30
196768
1
0
1
70
196869
30
5
1
61
196970
22
3
1
30
197071
20
6
1
30
197172
30
6
1
30
197273
28
8
1
30
197374
28
2
1
30
197475
28
7
1
30
197576
29
5
1
30
197677
30
5
1
30
197778
30
3
1
30
197879
30
1
1
30
197980
26
4
1
30
198081
25
2
1
100
198182
26
5
1
100
198283
27
3
1
100
198384
30
3
1
14
198485
24
0
1
44
198586
26
3
Guardate bene l'ultima tabella: al posto del nome del giocatore e dei suoi dati anagrafici,
ripetiamo soltanto il campo ID (in questo caso, 1). Con delle particolari istruzioni SQL (che
vedremo in seguito) è possibile mettere in relazione le tre tabelle ed estrarre dati
esattamente come avevamo fatto "a manina" nel primo esempio di oggi.
Al posto di "Franco Causio" possiamo scrivere, ogni volta, il suo campo ID, con un notevole
risparmio di codice ed efficenza. Pensate in una tabella contenente migliaia di calciatori
cosa significherebbe cercare "Franco Causio": il motore del dabase dovrebbe confrontare
tutte le stringhe, con un notevole ritardo delle prestazioni. Con un indice numerico diventa
tutto più veloce.
Andiamo adesso a chiarire termini tecnici di un database:
Record
Un record è l'insieme delle informazioni di un elemento. Semplificando il discorso, un
record è una riga di una tabella. Nel nostro caso, la tabella "squadre_giocatori" contiene 22
record.
Campo
Un campo è una caratteristica della tabella. Semplificando, è il nome della colonna.
Nell'ultimo esempio qui sopra, "id_giocatore","id_squadra", "presenze" ecc. sono i campi
della tabella "squadre_giocatori".
SQL
Structured Query Language. E' un linguaggio utilizzato per interrogare diversi tipi di
database. Tra un db ed un altro, la sintassi subisce poche variazioni ed è quindi semplice
accedere a diverse raccolte di dati.
Query
E' un'interrogazione al database. Attraverso il linguaggio SQL, con una query è possibile
estrarre informazioni e manipolare i dati.
Esempi di query:
query di interrogazione: "select anno_nascita from giocatori where nome='Franco Causio'"
query di cancellazione: "delete from giocatori where nome='Franco Causio'"
Il modo in cui, praticamente, i comandi vengono inviati ad una base dati cambia a seconda
del db utilizzato. Con Microsoft Access è possibile costruire le query in visuale ed inviarle
direttamente dal programma (è un db particolare, che in un solo file contiene tool, motore,
strumenti di sviluppo). Con mysql è possibile utilizzare la riga di comando (anche da DOS,
se è installato mysql sul pc), tool particolari o script php. Una pagina PHP consente un
accesso diretto a qualsiasi db mysql (di cui si conoscano username e password
ovviamente..)
Utilizzare mysql da riga di comando
Passiamo adesso alla parte pratica di questa lezione. Di sicuro la maggior parte di voi avrà
utilizzato Microsoft Access. Si tratta di un database particolare, come chiarivamo prima.
Access contiene infatti, in un unico file, sia il motore che intepreterà le query, sia il front-
end grafico (le tabelle viste già come se fossero un foglio Excel, righe-colonne), sia il tool di
interrogazione (vi consente di creare query in visuale..), sia il tool di sviluppo (editor Visual
Basic).
Forse è meglio che, per un pò, facciate finta di non aver mai conosciuto Access. Potrebbe
confondervi le idee, in quanto si tratta di una base dati pensata per un uso Home o per il
piccolo ufficio. Su internet è difficile utilizzare Access (anche se c'è chi lo fa, e con un pò di
esperienza anche con discrete prestazioni) perchè non è un database pensato per
connessioni multiple.
In questo corso utilizzeremo MySql. Il motivo è semplice: si tratta di un database gratuito e
utilizzato il più delle volte in applicazioni internet PHP. Si tratta di due progetti opensource, il connubio era inevitabile. Attenzione però: nulla vi vieta di utilizzare PHP anche
con altri database (perfino con Access..), cosi come nulla vi vieta di scrivere applicazioni in
altri linguaggi (come Java) con supporto al database MySql.
Su internet comunque troverete quasi sempre applicazioni scritte per PHP-MySql. Le
prestazioni di questo database sono eccellenti, e può essere utilizzato anche per progetti di
grande dimensioni. Ho gestito tabelle con oltre 100mila record e con tempi di risposta
nell'ordine dei centesimi di secondo.
Il problema è però il supporto online. Se avete installato EasyPHP, avete già il motore
MySql in ascolto sul vostro computer. Potete creare (poi vedremo come) più database,
secondo le vostre esigenze. Su internet non è cosi. Che io sappia, è quasi impossibile
trovare hosting gratuito che offra database MySql (Altervista ha il famoso discorso dei
crediti, ma è arduo raggiungerli...). Quindi, se avete bisogno di un database (necessario se
volete gestire una community: login utenti, forum, guestbook), dovete preventivare anche
la spesa di un provider a pagamento. Se invece volete "solo" imparare ad utilizzare MySql,
potete fare le vostre prove in locale senza problemi, grazie ad EasyPHP.
Potete anche decidere di scaricare il pacchetto MySql dal sito ufficiale, mysql.org, ma la
configurazione non è semplicissima (e se già avete installato EasyPHP, vi sconsiglio di
aggiungere altro).
Se venite dal mondo Access, forse pensate a MySql come un tool da aprire da qualche parte
con un doppio click.
Non è cosi. MySql è un "motore" in ascolto su una porta del computer. E' possibile inviare
istruzioni in linguaggio SQL attraverso la riga di comando. Possiamo anche utilizzare dei
tool grafici, ed è questo che faremo in seguito, tuttavia per ora useremo la riga di comando.
Le operazioni che faremo da adesso in poi possono essere eseguite indifferentemente da
una pagina PHP, dalla riga di comando o da un tool. Userò volta per volta un metodo
diverso cosi da illustrarli tutti, comunque voi potete usare quello che volete.
Partiamo con la creazione di un database, e per questo utilizzeremo la riga di comando.
Per prima cosa dobbiamo avviare il motore MySql. Non occorre lanciare EasyPHP (per ora
non dobbiamo scrivere codice PHP), basta avviare Mysqld (tecnicamente, il "demone"
MySql).
Apriamo il prompt Dos e portiamoci nella cartella Mysql, lanciando il programma. I file
eseguibili sono ovviamente nella cartella "bin", classica disposizione ambienti UNIX.
Lanciamo il programma digitando dal prompt dei comandi: mysqld
Una volta lanciato il demone dobbiamo digitare questa riga per averne il controllo:
mysql -hlocalhost -uroot
Non è una formula magica:
- "mysql" è il nome del programma da lanciare (dentro la cartella bin esistono altri
eseguibili, come mysqldump che serve per i backup). Possiamo anche scrivere mysql.exe,
va bene lo stesso.
- "-h" è un parametro: mysql cerca una connessione, ma ovviamente dobbiamo dirgli dove
andare. Omettere questo parametro sarebbe come lanciare Internet Explorer e lasciare la
pagina bianca.
- "localhost" è il valore del parametro "h": l'host su cui connettersi. In questo caso, il locale
del nostro computer, che abbiamo avviato prima con il comando mysqld.
Su internet, gli host vengono spesso identificati da un indirizzo del tipo
"sql.nomesito.com".
- "-u" è il parametro che precede l'username.
- "root" è appunto l'username
In realtà l'username può cambiare, ma nelle installazioni di default è "root", quindi credo
che ciascuno di voi abbia ottenuto la connessione con successo. Se è cosi, avrete ricevuto
un messaggio di benvenuto da Mysql.
Cosa abbiamo fatto? Riportiamo l'esempio nella vita di tutti i giorni. Immaginate una
macchina. Finchè non accendete il quadro, potete anche giocare con il freno, con la
frizione, con le luci.. non accadrà nulla, è come se foste in presenza di un giocattolo (a
meno che non siate in discesa e non proviate una partenza all'americana, ma non
complichiamo le cose..).
Una volta acceso il motore (con l'apposita chiave, una diversa per ogni vettura, salvo le Fiat
Uno..) potete utilizzare i comandi.
Questo è quello che abbiamo fatto dal prompt DOS: portandoci nella cartella del
programma Mysql e lanciando mysqld.exe, abbiamo "acceso il motore"
; con il programma "mysql.exe" invece abbiamo modo di controllare ed interagire con esso.
Adesso che abbiamo "il cruscotto dei comandi", cosa possiamo fare? Per prima cosa,
creiamo un nuovo database. Quando creiamo un db con Access, questo coincide con un
file. Con MySql non è propriamente cosi, si tratta di un db in ascolto su una porta ed i file
(comunque presenti nella cartella "data") sono particolari. Per intenderci: con Access
potete eseguire un backup del db semplicemente copiando/incollando il file, con MySql no.
Creiamo allora un database, chiamandolo "corso_php" (mi raccomando, evitate gli spazi
tra i nomi e sostituiteli sempre con gli underscore). Il comando da digitare è:
create database corso_php; (notate l'assenza dei doppi apici per delimitare il nome del db)
Attenzione: in mysql ogni comando va seguito da un punto e virgola (";"). Se
omettete il carattere, troverete un segnale di richiesta comando (del tipo
"=>"). Digitate comunque il punto e virgola e l'istruzione verrà eseguita.
Verifichiamo se il database è stato creato con il comando show databases;
Nel mio pc, trovo questo output (gli altri database che vedete sono ovviamente stati creati
in precedenza, voi dovreste trovare solo quello "corso_php"):
(adesso non andate a denunciarmi perchè vedete un db chiamato "picchetto", non è
riferito al totonero, è solo un gioco che faccio con mio fratello ogni week-end: inserisco
nel db 15 partite e dobbiamo indovinare i risultati, c'è poi anche il computer che estrae da
solo il suo pronostico).
Una volta creato un database, dobbiamo dare a mysql l'ordine di utilizzarlo. In un host
(anche nel nostro locale) possiamo avere più database (come nel mio caso). Va quindi
specificato quale utilizzare con questo comando:
use corso_php;
Adesso che abbiamo a disposizione un database, possiamo popolarlo creando una tabella.
La sintassi è:
CREATE TABLE nome_tabella (nome_campo tipo_campo opzioni_campo, nome_campo
tipo_campo opzioni_campo ecc., CHIAVI E INDICI);
Sulla prima parte dell'istruzione (CREATE TABLE nome_tabella) credo non ci sia bisogno
di commenti: diamo a mysql l'ordine di creare una nuova tabella con il nome passato come
parametro. Anche qui, evitate caratteri strani (lettere accentate o spazi nel nome).
Tra parentesi, separati da virgola, dobbiamo inserire i nomi dei campi: quelli che,
nell'esempio di prima, erano "id_giocatore", "nome_giocatore", "anno_nascita", "ruolo".
Dopo il nome del campo, dobbiamo specificare il tipo di dato. Un campo può infatti
contenere una stringa (ad esempio, un nome), un numero, una data e perfino un valore
binario (magari un'immagine).
Dopo il tipo di dato, se desiderate, vanno specificate le opzioni. Per ora utilizzeremo tre
opzioni: unsigned (per i valori numerici che non permettono coefficenti negativi), not null
(per campi obbligatori), auto_increment (per i contatori: automaticamente, inserendo un
nuovo record, questo campo incrementa il suo valore di 1 unità).
Dopo aver elencato tutti i campi, possiamo utilizzare le opzioni di indicizzazione. Le
opzioni di indicizzazione possono rendere un campo chiave primaria (il caso dell'ID di
prima), ovvero valore univoco. Se dichiariamo un campo chiave primaria, e poi cerchiamo
di inserire due valori uguali per quel campo, riceviamo un errore. Infine, possiamo dichiare
un campo come indice. Gli indici servono per velocizzare le ricerche nelle query. Mentre
ciascuna tabella può usare 1 sola chiave primaria, è possibile dichiarare più indici (sui
campi dove conviene farlo, è un aspetto evoluto dei database che vedremo nelle lezioni
successive: per ora limitatevi a dichiarare come indice la chiave primaria).
Solitamente, il campo chiave è sia indice che contatore. Se un campo è contatore, abbiamo
anche la certezza di inserirvi un valore diverso per ogni record (visto che Mysql
incrementerà da solo il valore), di riflesso avremo un campo univoco.
Chi ha dimestichezza con Access e crea tabelle in visualizzazione struttura, avrà familiari i
concetti sopra descritti.
Andiamo a creare la prima tabella dell'esempio precedente: quella contenente nome-data
nascita-ruolo dei calciatori. L'istruzione da inviare a mysql è questa:
CREATE TABLE giocatori (id_giocatore INT (11) UNSIGNED NOT NULL
AUTO_INCREMENT, nome_giocatore VARCHAR (100), anno_nascita DATE, ruolo
VARCHAR (1), PRIMARY KEY(id_giocatore), UNIQUE(id_giocatore),
INDEX(id_giocatore));
Compito a casa: scaricate il manuale mysql (da
http://www.mysql.com/documentation/index.html ) e provate a decifrare quanto scritto
sopra. Cosa sono quei numeri tra parentesi? E quali sono gli altri tipi di campo? Che
differenza passa tra un campo CHAR ed un VARCHAR? Non spaventatevi, dovrebbe essere
anche divertente spulciare tra i vari tipi di campo. Mysql supporta almeno 26 tipi di campo
diversi, quindi.. buon divertimento :)
Ovviamente, sono a vostra disposizione sul forum per i chiarimenti del caso.
Nella prossima lezione vedremo come inserire nuovi record in una tabella e modificare i
campi. Nulla vi vieta di visitare mysql.org e anticiparvi un pò di lavoro. Vedremo anche
qualche tool più semplice della riga di comando. Intanto digerite bene questi argomenti,
visto che, con 24 kb di lezione, vi trovate di fronte alla dispensa più "corposa" (battuto il
record di 20 kb delle lezioni 2 e 3).
Dimenticavo: dal prompt dei comandi digitate "quit" per uscire da mysql (che vi saluterà
con un "bye"). Potete uscire dal prompt msdos con il classico "exit".
Un tool grafico (finalmente!)
In effetti, come accennavo nella prefazione a questo corso, il mondo web è particolare.
Spesso non esiste una figura distinta, il "programmatore" e il "grafico". Il più delle volte
esiste il "web designer" (e meno male che stanno scomparendo termini come "web surfer"
o "web developer"!), persona che svolge entrambe le mansioni. Un web designer tipo sa
usare editor grafici (DreamVeawer o FrontPage) ma anche scaricare e personalizzare script
e codici di programmazione da internet.
Va da sè che una figura di questo tipo, decisamente efficace e produttiva per le aziende,
non utilizza strumenti "hard" come la riga di comando o gli script di Adobe Photoshop.
Se ho deciso di utilizzare la riga di comando, è perchè si tratta di un approccio efficace,
esplicativo.
Credo che tutti noi siamo stati avviati al mondo dei database da Microsoft Access: un
doppio click ed ecco a disposizione motore, query, ambiente di sviluppo Visual Basic e
perfino pagine pronte per la stampa (report)..
Negli altri database non è cosi, anzi con un doppio click non si ottiene proprio nulla!
Access è un db facile da utilizzare, pensato però per un ambiente casalingo o per la piccola
azienda. Su internet occorre gestire diverse connessioni, magari centinaia al minuto..
servono ben altri prodotti.
Per questo ho voluto utilizzare un approccio "hard": la riga di comando è quanto di più
genuino per comunicare con un normale database. Utilizzeremo in questa lezione dei tool
grafici ma non fatevi ingannare: non fanno altro che inviare dei comandi come quelli
illustrati in DOS nella precedente lezione. Un pò come quando realizzate un sito con
DreamVeawer: è facile perchè è tutto visuale, ma alla fine produce lo stesso codice che
qualcunaltro ottiene con notepad (o anche con Dos, digitando "edit" sul prompt.. è anche
meglio di notepad perchè almeno conta le righe!).
Quasi sempre però chi usa DreamVeawer ha un approccio (senza offesa) "viziato",
dipendente dal tool di sviluppo. Non è insomma "padrone" del codice, se la tabella layout
"spana" o si perde un </tr> non sa dove correre ai ripari.. Chi programma siti con notepad
ha un controllo totale sul codice, è capace di spostare un elemento "pixel per pixel".
"L'HTML è nulla senza controllo", parafrasando una nota pubblicità.
Con i database è lo stesso discorso. Usate pure i tool grafici per prendere familiarità, ma
ogni tanto tornate alla famosa "lezione 5": presto acquisirete padronanza dell'interfaccia e
potrete anche farne a meno.
Un primo approccio visuale: phpMyAdmin
Tra poco vedremo dei tool grafici che di certo non vi faranno rimpiangere phpMyAdmin.
Tuttavia è bene parlare di questo strumento perchè viene utilizzato da molti utenti, è open
source, non va installato. In soldoni: anche se presenta diversi limiti, è cosi diffuso che è
bene conoscerlo.
Avviate EasyPhp. Aprendo il localhost via browser, in alcune versioni dovreste già trovare
un pulsante "phpMyAdmin". Tuttavia, per evitare inutili problemi, scegliete una strada più
sicura. Adesso aprite il browser puntando all'indirizzo:
http://localhost/mysql/index.php
Dovreste avere un output html come questo:
Grazie a questa interfaccia html/php, possiamo gestire tutto il nostro db: creare nuove
tabelle, modificare record, estrarre dati, creare un nuovo db (almeno sul localhost) e
connetterci in remoto ad altri host sorgenti.
Praticamente, quello che potevamo ottenere con la riga di comando, in modo più semplice
e familiare.
A sinistra trovate un menù a tendina dalla quale scegliere un database. Di default,
phpMyAdmin effettua una connessione sul localhost. Con l'installazione di default di
EasyPhp dovreste avere già due database sul localhost, "test" e "mysql". Se avete eseguito
le istruzioni della lezione precedente, dovreste avere anche il db "corso_php". A fianco del
nome del db trovate il numero di tabelle che lo compongono:
Se nella scorsa lezione non siete riusciti a creare un db "corso_php" da riga di comando sul
prompt DOS, potete crearne uno adesso: scrivete direttamente il nome nella casella "Crea
nuovo database" e cliccate su "Crea".
Ma cos'è phpMyAdmin? Non confondete phpMyAdmin con MySql o con PHP.
phpMyAdmin è un insieme di script PHP che permettono di gestire un database. Se
studiate i codici sorgente del programma (li trovate nella cartella phpmyadmin dentro la
directory dove avete installato EasyPHP), non troverete altro che pagine php. Essendo un
tool open source, chi lo ha creato ha pensato bene di renderlo disponibile a tutti. Un
pacchetto come EasyPhp non poteva mancare di includere un tool del genere, che permette
di interagire completamente con un database complesso come MySql.
Quindi non pensate a phpMyAdmin come a qualcosa di misterioso che viene lanciato
chissà quando dal sistema operativo, vedetelo semplicemente come un sito internet
composto di codice php che permette di amministrare un database.
Abbiamo utilizzato la riga di comando per creare un db; faremo uso di phpMyAdmin per
creare delle tabelle.
Selezioniamo dal menù a tendina "home" il db "corso_php" (uno stesso host può avere più
db, cosi come un hard disk può contenere più file .mdb prodotti da Access).
Se avete completato la scorsa lezione, avrete già una tabella "giocatori". Andiamo adesso a
creare una tabella con l'elenco di tutte le squadre di calcio del campionato italiano 198990. Secondo i concetti appresi dai db relazionali, la nostra tabella dovrà essere composta
da:
.un campo contenente il nome della squadra;
.un campo contenente la sua chiave ID (un contatore univoco numerico che permette di
identificare un record, utilissimo per velocizzare le ricerche e per unire tra loro diverse
tabelle con dati comuni);
.già che ci siamo, inseriamo anche un campo numerico di 4 cifre con la data di fondazione
del club.
Il campo ID deve essere un numero che, automaticamente, viene incrementato di 1 unità
all'inserimento di una nuova squadra. In questo modo abbiamo la certezza di inserire un
valore univoco.
Il campo contenente il nome della squadra deve ovviamente essere una sequenza di
caratteri, una "stringa" come si dice in gergo informatico.
Infine, il campo relativo all'anno di fondazione deve essere un valore numerico di 4 cifre
(visto che nessuna squadra del nostro campionato è stata fondata nel medioevo, e, per
quanto ambiziosi possiamo essere, non abbiamo interesse a creare un sistema che funzioni
anche nel 10mila D.C. -5 cifre-).
Nella progettazione di una tabella, è importante scegliere il tipo di dato che ciascun campo
dovrà contenere (numero, data, stringa ecc.) ma anche la dimensione. Una tabella occupa
spazio, e riservare a dei campi che dovranno contenere poche lettere ciascuna (ad esempio
un cognome) dei valori esagerati (magari una stringa di 255 caratteri) significa sprecare
memoria e compromettere le prestazioni. Un pò come se compraste un autobus per andare
al lavoro, con dentro voi ed un collega. Spreco di risorse, di benzina, di bollo, di
assicurazione.
Sui database avremmo da parlarne fino a perderci, esulando dagli obiettivi di questo corso.
Se volete approfondire l'argomento potete cercare materiale su internet, tenete conto che
tra i vari database cambiano strutture, tool e metodi di accesso ma alcuni concetti (come i
tipi di dato) sono molto simili.
Andiamo quindi a definire il tipo di dato per il nostro database:
id (campo contatore, univoco, chiave primaria);
nome_squadra (campo stringa, possiamo assumere che un nome di squadra non supererà i
50 caratteri);
anno_fondazione (vogliamo contenere solo l'anno di fondazione e non il classico
.giorno/mese/anno., quindi possiamo utilizzare un normale campo numerico di 4 cifre
senza ricorrere ad un campo data)
Abbiamo due stade per creare una nuova tabella da phpMyAdmin: inviare un'istruzione
SQL (scrivendola su "esegui la query SQL sul database") o scrivendo il nome e il numero di
campi su "Crea una nuova tabella", più sotto. Trovato le due strade?
Utilizziamo entrambi gli approcci, cosi prendiamo familiarità con il linguaggio SQL.
Ovviamente mettetene in pratica uno (non potete creare due tabelle con lo stesso nome
nello stesso db), se volete provarli entrambi create una tabella e poi cancellatela.
Primo approccio: visuale. Digitate "squadre" nella casella "nome:" sotto "Crea una nuova
tabella nel database corso_php", e inserite il numero di campi desiderati (ovvero tre, nel
nostro caso: id, nome_squadra e anno_fondazione).
Dopo aver cliccato su "ESEGUI", avete a disposizione una tabella nella quale decidere il
nome del campo ed il tipo di dato associato. Per il campo ID segniamo un contatore chiave
univoca, per il nome della squadra una stringa di 50 caratteri e per l'anno un numerico di 4
cifre. La tabella va compilata in questo modo:
campo
Tipo
Lunghezza Extra
primaria indice unica
id
int
11
auto_increment yes
nome_squadra char
50
anno_fondazione smallint
Abbiamo utilizzato 3 campi, ciascuno di un tipo diverso.
Il primo campo è un intero, "auto_increment" (come detto sopra, ha un valore numerico
che viene incrementato automaticamente ogni volta che viene inserito un nuovo record).
"Nome_squadra" è invece una stringa che può contenere fino a 50 caratteri. Più che
sufficienti per il nome di una squadra di calcio.
Infine, l'anno di fondazione è un numerico. Invece di ricorrere ad un int, abbiamo
utilizzato uno smallint. Arabo vero? Illustriamo meglio con esempio pratici.
Ipotizziamo di dover acquistare un panino con prosciutto, straordinario matrimonio
alimentare. Per quanto possa costare, non credo che (almeno che non siate cosi
"giapponesi" -sorriso compreso- da comprarlo presso un venditore ambulante davanti la
fontana di Trevi) possiate spendere più di 3 euro.
Volendo è possibile pagare il panino con un assegno, ma.. poco praticabile. Sconsigliato.
Trasferiamo il discorso in informatica: è un inutile spreco di risorse usare un "blocco degli
assegni" (un campo che contiene valori -stringhe o numeri- di grande dimensioni, fino a
milioni di miliardi) per un banale "anno di fondazione", che di sicuro contiene 4 cifre.
Per questo, esistono diversi tipi di campo: i TINYINT, che possono contenere numeri
compresi tra 0 e 255 (pensate se doveste gestire i voti di una classe: in questo periodo di
scarsa crescita demografica, sarebbe un'eccezione se aveste più di 30 alunni), gli
SMALLINT (perfetti per gestire dati come gli anni..), i mediumint (arrivano fino a
16777251), gli INT (ancora più grandi) fino ad arrivare ai BIGINT
(9223372036854775807...).
Ovviamente, più è grande il valore massimo da contenere, maggiore deve essere la
"scatola", l'area di memoria riservata. Peggiore sarà la prestazione in fase di query.
Per questo, è necessario progettare bene il database e le tabella, tanto più quanto maggiore
sarà la mole di dati da contenere.
Vedremo nelle lezioni successive altri tipi di dato (VARCHAR, BLOB, TIME ecc.), per ora
accontentiamoci di questi. Per la gestione dell'anno di nascita delle squadre, ad esempio,
MySQL offre un apposito tipo di dato, YEAR, che non è compatibile però con versioni
precedenti la 3.22. Evitiamo inutili confusioni e andiamo tranquillamente avanti :)
Cliccando su "salva" creiamo la nostra tabella. PhpMyAdmin ci propone, nella pagina
successiva, anche l'istruzione SQL di creazione tabella (quella che avevamo visto al termine
della scorsa lezione). Un'istruzione SQL è un comando inviato ad un database. Tra i vari
tipi di database esistono poche differenze "dialettiche" SQL. L'idea era quella di creare un
linguaggio standard, ma la storia insegna che nell'informatica il concetto di "standard" è
relativo.. In ogni caso tenete presente che i comandi sono quasi uguali almeno nelle
funzioni base (creazione tabella, estrazione record, inserimento e cancellazione), per cui
spendere del tempo nell'apprendimento di SQL è un buon investimento. Anche in questo
caso vi rimando alle varie guide che trovate su internet, fermo restando che i concetti
fondamentali di SQL saranno giocoforza trattati anche in questa guida.
Andiamo ad inserire un record nella tabella. Nel frame di sinistra adesso dovremmo avere
anche l'ultima tabella creata, "squadre". Clicchiamo e poniamoci cosi sul pannello relativo.
In alto troviamo un link, "Inserisci": seguiamolo per inserire un nuovo record.
PhpMyAdmin è un tool efficace ma limitato dall'ambiente html, per cui possiamo trovare
alcuni difetti. Ad esempio, nella schermata di inserimento record, troviamo il campo
"valore" compilabile anche per la chiave id: questo è un chiaro errore, visto che abbiamo
dichiarato quel campo "auto_increment" e il motore MySql provvederà automaticamente
ad associargli il contatore.
Sorvoliamo e andiamo direttamente a compilare il campo "nome_squadra", inserendo
sotto la colonna "Valore" il nome di una società calcistica. In basso, vicino
"anno_fondazione", scriviamo il valore relativo (possiamo anche inventarli, comunque se
avete digitato "Napoli" scrivete 1926).
Per ora non date conto ai menù a tendina "funzione", si tratta di un argomento avanzato e
lo tratteremo un'altra volta (anche perchè raramente utilizzato, giusto in fase di
inserimento password).
Sotto trovate una comoda opzione: "Inserisci nuova riga E..", potete scegliere se dopo
l'inserimento del record tornare al pannello di controllo oppure farvi riportare su questa
stessa pagina in modo da inserire un'altro valore. Scegliamo la seconda ipotesi, cosi da
inserire un'altra squadra.
ops.. sorry c'è un errore nell'immagine, l'ultimo campo come detto sopra è uno smallint
mentre qui è un int. Provvederò a correggerlo, comunque usate lo smallint
Se volete, continuate ad esplorare phpMyAdmin senza paura (finchè siete su localhost in
fase di test, al massimo potete cancellare l'intero database, nulla vi vieta di ricrearne un
altro con lo stesso nome). Attenti però: nei database le operazioni non possono essere
cancellate. In soldoni, se per sbaglio avete eliminato un record, non avete modo di
recuperarlo, non esiste un "Modifica=>Annulla".
Mysql Control Center
PhpMyAdmin è un bel prodotto, certo più facile rispetto la riga di comando.
Restano però il limiti legati all'interfaccia html.
Se poi abbiamo a che fare con un database in remoto, diventa problematico con i tempi di
connessione e risposta.
A proposito, potete configurare altri database in phpMyAdmin inserendo gli appositi
parametri (forniti dal vostro provider) nel file:
phpmyadmin/config.inc.php
Come vedete, nella prima parte del file, trovate un array php contenente diverse voci.
Vanno compilate con i dati del db (mano mano che ne aggiungete uno).
Se incontrate difficoltà nell'inserire un nuovo database in phpMyAdmin, possiamo
parlarne nel forum. Vi raccomando di editare questo file esclusivamente con notepad, onde
evitare impicci (codice inserito da altri editor, "a capo" non voluti ecc.).
Comunque preferisco sorvolare nella guida su questa parte perchè concludiamo la lezione
con un altro tool, ancora più efficente e pratico di phpMyAdmin. Fino a poco fa era
disponibile un bel programmino, MySqlFront. Peccato che adesso sia diventato a
pagamento. In giro potreste trovare ancora la vecchia versione, ma è meglio puntare su
altro per questo corso, cosi da utilizzare un tool comune.
Utilizziamo nientemeno che il tool ufficiale di mysql.com: mysql control center.
Andiamo su mysql.com e cerchiamo nell'area "products" il file (scorrete la pagina fino a
"MySQL Control Center", cliccate sul link o sull'immagine).
Scegliamo nella nuova pagina "Download the latest version" e quindi su "Windows
downloads": "pick a mirror" (lo so, potrei darvi direttamente la url, ma tra qualche mese
può cambiare la struttura del sito ed è meglio, per i futuri lettori della guida, muoversi tra i
vari link).
Scegliamo un mirror qualsiasi e iniziamo il download. Attualmente il file si chiama
mysqlcc-0.9.4-win32.zip. Mentre attendete il download, gustatevi il preview :)
L'installazione è in classico stile windows, se volete personalizzare qualcosa potete togliere
i linguaggi supportati (lasciando l'italiano ovviamente) per risparmiare spazio su hard disk.
Terminata l'installazione, lanciate il programma e selezionate (premendo CTRL+O) nelle
opzioni la lingua italiana. Chiudete e riavviate il tool per dare effetto alle modifiche.
Dal menù "File" cliccate su "Nuovo" per impostare una nuova connessione. Come
parametro mettete i dati del localhost: Hostname localhost, user name root, password
vuota. In "Nome" inserite quello che volete, qualcosa che identifichi la connessione
(chessò, "corso", "weblink", "locale")..
Lasciate tutte le altre opzioni così come le trovate, quindi cliccate su "Add".
Nella finestra principale, trovate a sinistra "MysqlServer". Cliccate con il destro sul nuovo
creato e selezionate "Connetti". Con un doppio click sul nome del database (i soliti "test",
"corso_php" e "mysql" che dovreste già avere) possiamo aprire il pannello di controllo con
l'elenco di tutte le tabelle.
Selezionate con il tasto destro una tabella ("giocatori") e guardate quante opzioni sono a
vostra disposizione: possiamo agire in visuale sulla struttura!
Andiamo adesso a cliccare sul tasto "SQL" (raggiungibile anche premendo CTRL+Q). Ci
troviamo in ambiente QUERY.
Possiamo scrivere la nostra query (come abbiamo fatto prima su phpMyAdmin) per creare
nuove tabelle, per estrarre informazioni, per inserire nuovi dati.
Dobbiamo ricorrere ad istruzioni SQL, che vedremo meglio la prossima volta.
Potete però già iniziare a giocare: guardate che succede quando cliccate su "QUery=>Tipo
di query=>query di inserimento" (sembra Access!)... Viene già proposta un'istruzione sql
base. Riuscite, attraverso questa, a capire come inserire nuovi dati nella nostra tabella delle
squadre? Una volta scritta la query, eseguitela premendo CTRL+E.
Esiste un altro modo di inserire dati. E' bene però che prendiate familiarità con l'SQL
perchè è l'unico modo di far interagire una pagina PHP con un db.
Comunque: tasto destro del mouse su una tabella, scegliete "Apri tabella" visualizzando
"tutte le righe".
Tasto destro del mouse su un qualsiasi record, "Inserisci record".. a questo punto sembra
davvero di stare in Access (nel senso familiare del termine.. tecnicamente mai più!).
Come compitino per questa settimana, giocate con questi strumenti e cercate di popolare le
tabelle.
Ogni tanto guardate anche phpMyAdmin: quando eseguite un'operazione vi restituisce
l'SQL stampandolo a video, niente male per acquisire dimestichezza.
Riguardo MySqlControlCenter, è un tool open source e in continuo sviluppo. Se trovate
ogni tanto il programma bloccato, lasciatelo stare e attendete che termini la query o la
connessione, è normale (almeno finchè dura pochi secondi). Nella finestrella in basso,
"Debug SQL", trovate le istruzioni inviate al server. Quelle che potreste inviare anche voi
connettendovi dalla riga di comando (sono fissato eh!).