L' estensione MySQL di PHP è obsoleta

Dicembre 2016

PHP è un ottimo linguaggio di programmazione per i server web ma non può (da solo) archiviare dei dati in modo strutturato, per ciò è necessario utilizzare delle estensioni che gli permettano di connettersi e d'utilizzare dei DBMS. Per connettersi a MySQL (uno dei più noti DBMS) si può utilizzare l'estensione MySQL (funzione
mysql_*
) di PHP. Tuttavia questa estensione è ormai obsoleta.

Nota Bene: si parla dell'estensione MySQL di PHP, chi è obsoleta, e non del database MySQL.

Se è già utilizzata nel proprio sito si raccomanda di eliminarla e utilizzare un'altra estensione come PDO o MySQLi.


Obsoleta da PHP 5.5

PHP 5.5.0 è uscito ufficialmente il 20 giugno 2013 (Annuncio su php.net) ed è proprio in questa versione che è stato deciso che l'estensione MySQL sarebbe divenuta desueta. Per saperne di più, ecco la pagina di RFC riguardante questa decisione.

Da notare il fatto che nelle prossime versioni di PHP, quest'estensione non sarà più disponibile. È stato anche deciso che prima di PHP 6, l'estensione scompaia del tutto e che, molto probabilmente, sia ritirata anche dal codice sorgente di PHP. Da sapere, utilizzare la funzione
mysql_*
con PHP 5.5 genera un avviso (Warning E_DEPRECATED) nella pagina.

Più di 15 anni di storia

L'estensione MySQL è stata introdotta ai tempi della versione PHP 2.0, prima del 1998, anno di uscita di PHP 3. Appare ovvio il fatto che le tecniche di più di 15 anni fa hanno qualche difficoltà a restare attuali anche oggi, soprattutto nel campo dell'informatica dove tutto evolve così velocemente. Ecco perché questa estensione è più lenta rispetto alle altre disponibili.

Le connessioni al DB: l'ultima è quella di default

Le funzioni
mysql_*
, se non viene indicato il database, prendono per default l'ultimo DB al quale si è connesso, questo costituisce così due generi di problema: il primo quando si gestiscono più database alla volta: per una svista, le query SQL verrà eseguita nel database sbagliato.

La seconda problematica, invece, riguarda il rintracciamento dei bug: nessuna variabile descrive esplicitamente la connessione, dunque è impossibile sapere precisamente da dove deriva il problema e sarà impossibile risalire alla creazione della connessione tramite un IDE/Debugger, si dovrà provvedere a ricercare il
mysql_connect
a mano e aggiungere il codice di debugging per scoprire cosa è successo.

Mancata gestione errori

PHP 5 ha apportato un modello direttamente derivato dalla programmazione orientata agli oggetti: le eccezioni. L'estensione MySQL è troppo vecchia e non è mai stata aggiornata affinché possa utilizzarle. Per la gestione degli errori si utilizza un'altra estensione mysql_error(). Lo svantaggio è che si deve aggiungere il proprio codice di gestione degli errori dopo ogni funzione
mysql_*
per poter intercettare un errore.

Le eccezioni (o la gestione delle eccezioni) permettono di fermare l'esecuzione di un blocco di un codice e andare direttamente al codice che gestisce gli errori, il che semplifica il codice non solo per il programmatore ma anche per lo stesso PHP, nel senso che le eccezioni costituiscono un sistema passivo, innescato solamente quando le funzioni utilizzate segnalano un errore. Invece con il vecchio metodo (estensione
mysql_error()
) si prevede la verifica ad ogni volta, il che comportava linee di codice in più e perdita del tempo.

Ideato per MySQL 3.23

Gli utenti più esperti in (My)SQL resteranno delusi di non poter approfittare di alcune funzioni apparse dopo la versione 3.23 dato che l'estensione non sia mai stata aggiornata con le nuove funzionalità. Delle procedure SQL che possono rivelarsi pratiche non verranno sfruttate. Secondo alcuni programmatori, l'estensione farebbe fatica anche nella gestione di alcune codifiche di testo.

Criptare le connessioni

Le connessioni a un DB remoto possono essere sicurezzati da SSL (Secure Socket Layer), invece non si può fare da TLS (Transport Layer Security). Dato i problemi di sicurezza rilevati nel protocollo SSL, quest'ultimo non dovrà più essere utilizzato e sostituito da TLS 1.1 o successive versioni. L'estensione MySQL non supporta le connessioni TLS e quindi costringe gli utenti a utilizzare un protocollo di sicurezza che deve essere considerato anch'esso obsoleto.

Mancata query preparata

Questo può essere considerato il punto più importante di tutta la guida: l'estensione MySQL non ha delle query preparate. Perché è da considerasi così importante? Le query SQL sono spesso variabili a seconda la scelta dell'utente. La soluzione più semplice da applicate (e purtroppo la più usata e conosciuta) assomiglia a:
mysql_query('UPDATE Utenti SET nome="'.$_GET['nome'].'" WHERE nome="'.$nome.'"');


Tutto risulta funzionante e va bene così, le virgolette sono al posto giusto. Però un utente può accedere ad amministratore inserendo nell'URL:
cambia-nome.php?nome=%22%20admin%3D1%20nome%3D%22USERNAME
. È vero che si può rimediare a tale problema utilizzando
mysql_real_escape_string
, che è certamente efficace, ma lungo e a forza di servirsene lo si utilizza 2 volte in un parametro.

Le query preparate, invece, propongono una soluzione migliore: basta preparare la struttura della propria query, poi eseguirla con le impostazioni desiderate (ad es. con PDO):

$query = $pdo->prepare('UPDATE Utenti SET nome=:nuovonome WHERE nome=:nome');
$req->execute(array(
    "nuovonome" => $_GET['nome'],
    "nome" => $nome
));


Ecco che senza preoccuparsi della SQL injection, il lavoro più duro è stato già fatto.

Un rischio per il futuro

L'estensione è in fine di vita e la sua eliminazione da PHP è imminente e, peggio, il vostro sito se ne serve!!! Attualmente esiste tutta una sorta di "cultura" riguardante l'estensione che è destinata a scomparire ma inconsapevolmente molti tutorial e ancora molta gente raccomanda l'utilizzo delle funzioni:
mysql_*
ignorando le loro prossima eliminazioni e i loro svantaggi.

Per tutte queste ragioni bisogna assolutamente convertire i propri script, siti anzi CMS verso un'altra API d'accesso ai DB. Più la transizione è veloce, minore sarà il numero di problematiche. Certamente si troveranno delle difficoltà nel passare dall'estensione MySQL a un'altra, ma una volta fatto, se ne avrà bisogno, migrare da un connettore DB ad un altro risulterà semplice, le API moderne hanno tutte (più o meno) la stessa struttura.

Poco e presto più mantenuto

L'assenza di manutenzione del codice provoca un rischio maggiore che riguarda le falle di sicurezza che non saranno mai corrette. Così moltissimi siti saranno esposti a problemi di sicurezza.

Cosa usare

La risposta è semplice:


PDO, con interfaccia orientata agli oggetti e funziona su più DBMS (MySQL, MSSQL, SQlite, ecc).

MySQLi, con interfaccia orientata agli oggetti e modello funzionale, compatibili tra loro; forte somiglianza all'estensione MySQL.

Diffusione del messaggio

Se scova qualcuno che ancora consiglia l'estensione MySQL o che sta imparando a servirsene, cercare di dissuaderlo dall'errore che sta per commettere è un primo passo per allontanarsi da questa estensione ormai obsoleta.

Potrebbe anche interessarti :
Il documento intitolato « L' estensione MySQL di PHP è obsoleta » da CCM (it.ccm.net) è reso disponibile sotto i termini della licenza Creative Commons. È possibile copiare, modificare delle copie di questa pagina, nelle condizioni previste dalla licenza, finché questa nota appaia chiaramente.