Attualmente quando accediamo ad un database tramite PHP abbiamo due opzioni corrispondenti ad altrettante estensioni: PDO oppure MySQLi. Le differenze principali fra le due librerie riguardano i database supportati, la gestione dei parametri e le performance.
Database supportati
La principale differenza tra PDO e MySQLi sta nel numero dei database supportati: mentre MySQLi supporta, come indica il nome stesso, soltanto MySQL, PDO può supportare 12 diversi database, il supporto effettivo è poi legato ai driver presenti nell'ambiente di riferimento. Per consultare una lista dei driver effettivamente disponibili possiamo usare la seguente istruzione:
var_dump(PDO::getAvailableDrivers());
Questo significa ovviamente che nel caso in cui la nostra applicazione dovesse migrare verso un altro database, con MySQLi dovremmo riscrivere buona parte del nostro codice, mentre con PDO ci limiteremmo a modificare le istruzioni SQL proprietarie del database di riferimento.
Named Parameters
La seconda grande differenza tra PDO e MySQLi riguarda il supporto per i Named Parameters. I Named Parameters, che analizzeremo nel dettaglio più avanti, sono parametri "nominali". Nella mia query PDO posso quindi indicare il parametro con il simbolo ":
" seguito da una stringa; se volessi inviare per esempio il parametro "email" dovrei scrivere: :email
. MySQLi non supporta invece i Named Parameters, ma solamente l'uso di segnaposto (placeholder
) tramite il carattere "?
"
Lo svantaggio del mancato supporto di questa features è abbastanza evidente: obbliga lo sviluppatore a tenere traccia dell'ordine dei parametri e il codice generato è meno intuitivo e leggibile rispetto alla medesima versione con PDO.
Sicurezza
Premesso che la via migliore per rendere sicure le istruzioni con cui interagire con i dati è quella di utilizzare i prepared statement, esiste un'importante differenza fra le due librerie che riguarda l'escaping manuale: MySQLi dispone infatti della funzione mysqli_real_escape_string()
che permette l'escape della stringa passata ad essa come argomento, PDO usa invece PDO::quote()
che, oltre ad effettuare l'escape della stringa, esegue anche il quoting.
Performance
Dal punto di vista delle performance la bilancia pende a favore di MySQLi anche se in modo non particolarmente significativo: dato che MySQLi è un'estensione nativa gode di migliori prestazioni, ma la differenza è minima e sarà rilevante soltanto in progetti caratterizzati da un carico di lavoro veramente significativo.
Quale libreria scegliere?
Complessivamente l'opzione PDO presenta vantaggi abbastanza rilevanti quando non è l'unica opzione realmente percorribile, la scelta su MySQLi ricade invece se abbiamo bisogno di massimizzare le performance e il database di riferimento è esclusivamente MySql, oppure quando dobbiamo utilizzare funzionalità particolarmente avanzate disponibili nelle ultime versioni di MySQL.