PHP e MySQL

Introduzione ai database e MySQL

Nelle guide precedenti abbiamo visto come memorizzare in maniera permanente informazioni tramite i file e le funzioni che PHP mette a disposizione per leggere e scrivere dati su diversi formati di file.

In molti scenari i file sono in grado di svolgere il loro compito in maniera egregia, ma quando dobbiamo gestire una gran mole di dati sorgono problemi dovuti ai limiti imposti dai file, come l'impossibilità di accedere al contenuto di un file da parte di più utenti contemporaneamente oppure l'eccessivo uso di risorse nel caso di file di grosse dimensioni (nell'ordine dei GigaByte).

È in questo scenario che entrano in gioco i database. In questa guida faremo una breve introduzione ai database e vedremo cos'è MySQL, i suoi vantaggi e cos'è il linguaggio SQL. Nelle guide successive invece vedremo come utilizzare MySQL per creare applicazioni PHP potenti, efficienti e in grado di gestire una gran quantità di informazioni.

Cos'è un database

Un database, letteralmente base di dati, è una raccolta di dati organizzata in modo ordinato, così come una biblioteca può essere considerata una raccolta di libri.

Esistono diversi tipi di database: i primi ad essere utilizzati sono stati i database relazionali, seguiti dai database orientati agli oggetti nei primi anni 90 e dai database NoSQL che sono nati per soddisfare l'esigenza di maggiore velocità ed elaborazione dei dati non strutturati.

Database
Il simbolo del database

Il modello più utilizzato ancora oggi è quello relazionale. Gli elementi di un database relazionale sono organizzati sotto forma di tabelle composte da colonne e righe. Questo tipo di database offre la soluzione più efficiente e flessibile per accedere alle informazioni.

DBMS e MySQL

Un database viene gestito tramite il DBMS (Database Management System), letteralmente sistema di gestione di database, ossia un software che consente il controllo e la gestione completa di un database.

Nella pratica, un DBMS funge da interfaccia tra il database e gli utenti finali consentendo tra le altre cose la creazione di database, la memorizzazione, l'interrogazione, la modifica e l'eliminazione dei dati, oltre alla gestione dell'integrità degli stessi.

Inoltre, un DBMS consente la gestione amministrativa di un database, offrendo operazioni quali monitoraggio delle performance, backup e ripristino dei dati.

La parola database viene utilizzata sia per riferirsi al database vero e proprio, sia per riferirsi al DBMS, dunque d'ora in avanti ci riferiremo al DBMS come al database.

PHP è in grado di gestire un gran numero di database, alcuni di questi sono: SQLite, MySQL, PostgreSQL, Oracle, Microsoft Access, Microsoft SQL Server, MongoDB. In generale è possibile utilizzare uno qualsiasi di questi database nelle nostre applicazioni PHP. Tuttavia in questa e nelle guide successive ci concentreremo su MySQL.

MySQL è uno dei più popolari database attualmente in uso sul web ed è senza dubbio il più popolare utilizzato in combinazione col linguaggio PHP. È open source ed è disponibile nel pacchetto di installazione di XAMPP.

MySQL offre numerosi vantaggi:

  • è stato progettato e ottimizzato per le applicazioni web, comprese quelle sviluppate in PHP
  • è facile da usare, ma estremamente potente, veloce, sicuro e scalabile
  • supporta SQL (Structured Query Language), il linguaggio utilizzato per interrogare i database
  • è multipiattaforma e funziona su diversi sistemi operativi inclusi Linux, Windows e Mac OS
  • PHP e MySQL sono la migliore accoppiata per lo sviluppo di applicazioni web di piccole e grandi dimensioni
  • include strumenti di amministrazione intuitivi e potenti come phpMyAdmin o MySQL Workbench.

Come funziona MySQL

MySQL archivia i dati in tabelle come altri database relazionali. Una tabella è una raccolta di dati correlati ed è divisa in righe e colonne.

Ciascuna riga in una tabella rappresenta un set di dati intrinsecamente connessi tra loro, mentre ogni colonna rappresenta un campo specifico.

Ritornando all'esempio della biblioteca, un'ipotetica tabella di nome libri potrebbe essere rappresentata in questo modo

+-----+-------------------------+------+
|  id | titolo                  | anno |
+-----+-------------------------+------+
|  1  | Il signore degli anelli | 1955 |
|  2  | Shining                 | 1977 |
|  3  | Frankenstein            | 1818 |
|  4  | Il Gattopardo           | 1958 |
|  5  | La forma dell'acqua     | 1994 |
+-----+-------------------------+------+

Id, titolo e anno rappresentano le colonne della tabella, mentre ciascuna riga contenente i valori di ogni colonna è un record. Vediamo come è possibile prelevare questi dati per poterli utilizzare nelle nostre applicazioni. Introduciamo allo scopo un nuovo linguaggio.

Il linguaggio SQL

SQL, Structured Query Language, è il linguaggio utilizzato per comunicare con i database relazionali come MySQL. Con SQL è possibile eseguire qualsiasi operazione relativa ai database come la creazione di database e tabelle, il salvataggio dei dati nelle tabelle, l'interrogazione di un database per specifici record, l'eliminazione e l'aggiornamento dei dati nei database.

Con SQL é possibile:

  • creare un database
  • inserire, modificare e gestire i dati
  • selezionare i dati
  • eliminare i dati
  • gestire i permessi di accesso ai dati

I comandi utilizzati per effettuare tali operazioni vengono chiamati query. Nei paragrafi seguenti vedremo la sintassi SQL per ciascuna delle operazioni appena elencate.

Per approfondire rimandiamo alla lettura della documentazione MySQL.

Creare un database

Tramite l'istruzione CREATE DATABASE è possibile creare un nuovo database. È sufficiente indicare il nome del database dopo l'istruzione, come mostra il seguente esempio

CREATE DATABASE biblioteca

Creare una tabella

Una volta creata la struttura del database è necessario aggiungere le tabelle. È possibile farlo tramite il costrutto CREATE TABLE seguito dal nome della tabella e dai campi.

Vediamo un esempio di utilizzo

CREATE TABLE `libri` (
  `id` int(11) PRIMARY KEY NOT NULL,
  `titolo` varchar(80) NOT NULL,
  `anno` int(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ALTER TABLE `libri`
CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT;

Con la query precedente abbiamo creato una tabella di nome libri con i seguenti campi:

  • id di tipo integer
  • titolo di tipo varchar
  • anno di tipo integer

Inoltre abbiamo definito il campo id come chiave primaria e reso questo campo autoincrementante tramite la clausola AUTOINCREMENT contenuta nella query successiva ALTER TABLE, utilizzata per modificare la struttura di una tabella.

Inoltre ogni volta che viene inserito un nuovo record, il valore di id viene incrementato in maniera automatica di una unità prendendo in considerazione il valore dell'ultimo id inserito.

Inserire i dati

L'inserimento di un nuovo record in una tabella già esistente viene effettuato tramite l'istruzione INSERT

INSERT INTO libri (id, titolo, anno) VALUES (0, 'La storia infinita', 1979)

La INSERT prevede che la tabella che si vuole popolare esista e per ciascun campo venga rispettato il tipo.

Nota: specificando il valore 0 per il campo id, MySQL provvederà ad incrementarne il valore a partire dall'ultimo id inserito.

Modificare i dati

L'istruzione UPDATE consente di modificare il contenuto di alcuni campi nei record che soddisfano una determinata condizione posta in WHERE. Se non si indica nessuna condizione vengono modificati tutti i record.

Con la clausola SET si indica il campo o i campi da modificare seguiti dal simbolo uguale e dal nuovo valore.

Vediamo un esempio di utilizzo per modificare un singolo campo

UPDATE libri SET anno = 1900 WHERE id = 4

e per modificare campi multipli

UPDATE libri SET anno = 1900, titolo = 'Nuovo titolo' WHERE id = 4

Selezionare i dati

L'istruzione SELECT consente di estrarre un elenco di record dalla tabella indicata nella clausola FROM e che soddisfano una determinata condizione (opzionale) impostata tramite l'operatore WHERE.

Di seguito è mostrato un esempio di query che restituisce tutti i titoli dalla tabella libri

SELECT titolo FROM libri

Se si esegue la query verranno restituiti i seguenti record

+-------------------------+
| titolo                  |
+-------------------------+
| Il signore degli anelli |
| Shining                 |
| Frankenstein            |
| Il Gattopardo           |
| La forma dell'acqua     |
+-------------------------+

Se vogliamo ottenere il titolo del libro il cui codice è uguale a 128489 dobbiamo eseguire la stessa query precedente con l'istruzione WHERE

SELECT titolo FROM libri WHERE id = 2

che restituirà

+-------------------------+
| titolo                  |
+-------------------------+
| Shining                 |
+-------------------------+

Eliminare i dati

L'eliminazione dei dati avviene tramite il costrutto DELETE ed è possibile:

  1. Cancellare tutti i record della tabella
  2. Cancellare un singolo record

Per cancellare un record possiamo utilizzare la seguente interrogazione SQL

DELETE FROM libri WHERE id = 2

Una successiva interrogazione alla tabella libri restituirà i seguenti record

+-------------------------+
| titolo                  |
+-------------------------+
| Il signore degli anelli |
| Frankenstein            |
| Il Gattopardo           |
| La forma dell'acqua     |
+-------------------------+

Per cancellare tutti i record è sufficiente omettere l'istruzione WHERE

PHP e MySQL

PHP mette a disposizione due estensioni per gestire un database MySQL:

  1. L'estensione mysqli che consente di accedere alle funzionalità fornite da MySQL 4.1 e versioni successive.
  2. L'estensione PDO che fornisce un'interfaccia leggera per interagire con qualsiasi database incluso MySQL.

Al posto di usare una di queste due estensioni, nelle applicazioni moderne è ormai d'uso comune l'utilizzo di un ORM (Object Relational Mapping), una tecnica di programmazione che consente di mappare in classi i dati del database, consentendo al programmatore di sfruttare la programmazione ad oggetti.

Gli ORM verranno discussi nella guida avanzata dedicata allo sviluppo e manutenzione di applicazioni web professionali. Nella guida successiva invece analizzeremo MySQLi e le sue funzioni base per l'accesso e la gestione di un database MySQL in PHP.