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!).