Operare su un database di MySQL con ‘msqli’

Un’ Application Programming Interface, o API, definisce le classi, i metodi, le funzioni e le variabili di cui un’applicazione ha bisogno per svolgere un determinato compito. Per connettersi ad un server MySQL, il linguaggio PHP offre tre diverse API tramite le seguenti estensioni:

  1. mysql
  2. mysqli
  3. PDO (PHP Data Object).

Per i nuovi progetti si consiglia di utilizzare solo le ultime due, la prima estensione, infatti, è stata dichiarata ‘deprecated‘ (sconsigliata) già in PHP 5.5.0 e a partire dalla versione 7.0.0 del linguaggio è stata addirittura rimossa. Per approfondimenti su tutte le estensioni si rimanda direttamente alla documentazione del linguggio PHP disponibile on line (link), in questo articolo invece prenderemo in considerazione l’estensione mysqli e ne descriveremo un uso base, utilizzando come fonte proprio la su citata documentazione del linguaggio.

L’estensione msqli

L’estensione mysqli, che è una versione ‘migliorata’ rispetto alla precedente (mysqli=mysql improved extension), consente di accedere alle funzionalità fornite dalla versione 4.1 del server MySQL e superiori. Essa offre una duplice interfaccia, una basata sul paradigma di programmazione procedurale, l’altra sul paradigma OOP (orientato agli oggetti). Gli utenti che migrano dalla vecchia estensione mysql potrebbero preferire l’interfaccia procedurale, in quanto molto simile a quella della vecchia estensione mysql. In molti casi, infatti, i nomi delle funzioni differiscono solo per il prefisso. In quest’articolo, invece, prenderemo in considerazione solo l’interfaccia OOP, in quanto più moderna e potente. Per chi è interessato all’interfaccia procedurale si rimanda alla documentazione (link). Nelle pagine della documentazione si trova sempre una doppia indicazione:

  • OOP interface: l’implementazione orientata agli oggetti, a cui qui facciamo riferimento.
  • Procedural interface: l’implementazione procedurale che qui tralasciamo.

La classe mysqli

Gli oggetti di classe mysqli hanno il compito di gestire la connessione fra PHP e il server MySQL per permettere agli script PHP di operare su un database di MySQL.

Connessione al database – La connessione ad un database di MySQL viene associata ad un oggetto di questa classe e l’attivazione della connessione avviene istanziando l’oggetto con una chiamata al metodo costruttore della classe tramite l’operatore new, secondo la seguente sintassi tipica dei linguaggi OOP:

Il costruttore richiede quattro parametri:

  • l’indirizzo/indirizzo ip dell’host sul quale risiede il server MySQL a cui connettersi;
  • username e password di un utente registrato sul server MySQL e che abbia gli opportuni privilegi di accesso in funzione delle operazioni che gli script PHP dovranno eseguire;
  • il nome del database che si ha intenzione di utilizzare (opzionale).

Tutti i parametri devono essere passati al costruttore come stringhe.

Con l’istruzione precedente si ottiene un riferimento all’oggetto associato alla connessione che viene stabilita con il database, che nell’istruzione dell’esempio di sopra viene assegnato alla variabile di nome $db. Attraverso questo riferimento è possibile richiamare i metodi e gli attributi dell’oggetto associato alla connessione per operare sul database e più in generale interagire con il server MySQL.

NOTA – E’ possibile omettere di passare al costruttore il quarto parametro (che è opzionale). In tal caso viene solo stabilita la connessione con il server MySQL senza l’utilizzo di un database specifico. Può essere questo il caso in cui si debba operare sul server per esempio per creare un nuovo database. Per passare ad utilizzare un database specifico fra quelli presenti sul server MySQL, è possibile utilizzare il metodo select_db() che richiede come unico parametro il nome del database sotto forma di stringa.

Eseguire le operazione su un database – Per operare sul database in uso (con il quale cioè  si è stabilita la connessione) è possibile utilizzare il metodo query() che consente l’invio di un comando SQL al DBMS, utilizzando la sintassi del seguente esempio:

Il metodo query richiede che il comando SQL da eseguire sia passato sotto forma di stringa. Si fa notare che in PHP per richiamare un membro di un oggetto si utilizza la sintassi ‘->‘ (e non la ‘dot notation’, il punto).

P.S. Il metodo query() può ricevere un secondo parametro opzionale per fissare se realizzare una query buffered (modalità di default) o unbuffered.  Il secondo parametro opzionale al momento lo tralasciamo e assumerà quindi il suo valore di default realizzando query con un recupero buffered del suo set di risultati. Per approfondire questo aspetto, che non verrà trattato in questo articolo perché solo introduttivo, si rimanda alla documentazione del linguaggio: link.

Il valore restituito dal metodo query() potrà essere:

  • in caso di fallimento della query: false;
  • in caso di successo della query:
    • se il comando impartito richiamando il metodo query() produce un risultato composto da un set di risultati (può essere il caso dei comandi: SELECT, SHOW, DESCRIBE ecc.): è un riferimento ad un oggetto di classe mysqli_result;
    • negli altri casi (può essere il caso dei comandi: CREATE TABLE, ALTER TABLE, DROP TABLE, INSERT INTO ecc.): true.

La classe mysqli_result

Un oggetto di questa classe viene associato al set di risultati ottenuti da una query. Nel caso di una SELECT esso è una tabella e su questa tabella l’oggetto mantiene un riferimento (detto cursore) ad una particolare riga, che chiamiamo riga corrente. In partenza, quando cioè l’oggetto viene istanziato, la riga corrente è la prima. La riga indirizzata dal cursore può essere accessibile con più di una modalità, qui prendiamo in esame quella che consiste nel richiamare sull’oggetto il metodo fetch_assoc(). Questo metodo restituisce la riga corrente del risultato come un array associativo in cui le chiavi sono costituite dagli identificatori di colonna della tabella risultato. Inoltre ogni volta che il metodo viene richiamato, il cursore si sposta sulla riga successiva, se disponibile. Quando il cursore raggiunge la fine della tabella il metodo restituisce NULL. Vediamo un semplice esempio:

Quando il risultato non è un record singolo ma una tabella, spesso si ha la necessità di fare una scansione di tutti i record della tabella risultato. Questo può essere realizzato inserendo la chiamata al metodo fetch_assoc() in un ciclo che viene controllato sfruttando il fatto che quando si raggiunge la fine della tabella il metodo resituisce NULL, valore che si ricorda PHP interpreta come FALSE. Vediamo un semplice esempio:
Nell’esempio precedente è stato utilizzato anche l’attributo num_rows dell’oggetto di classe mysqli_result, che contiene il numero di righe della tabella risultato.

P.S. Negli esempi precedenti per semplicità non sono stati gestiti gli errori che possono essere generati dall’esecuzione delle istruzioni precedenti e che vanno gestiti se non si vuole la comparsa nella pagina di messaggi incomprensibili all’utente. Essi vengono trattati in un altro articolo (link).