Nuova caratteristica di PHP: MySQLi
PHP interromperà presto il supporto per MySQL? È proprio questa domanda ad aver generato incertezza nella comunità PHP, in seguito a un messaggio di errore apparso dopo il collegamento a un server MySQL effettuato con la vecchia estensione mysql, che raccomandava tra l’altro il passaggio a ext/mysqli. Questo “avviso di deprecazione” (Deprecation Notice) è stato emesso a partire da PHP 5.5, ma l’estensione mysqli è stata introdotta già con PHP 5.0. Vi ricordiamo: era il 2004.
Perché questa incertezza? Il team PHP di Oracle ha dovuto rendersi conto che molti stavano ancora usando ext/mysql, compresi i grandi gruppi del settore come WordPress. Per questo motivo Oracle ha deciso di avviare un graduale processo di deprecazione. Così, con l’introduzione di PHP 7, l’estensione mysql è stata disattivata definitivamente. In questo articolo vi presentiamo MySQLi nel dettaglio con esempi e approfondiamo le differenze tra le due estensioni.
Archivia i tuoi dati in tutta sicurezza sui nostri server, e proteggili dagli accessi non autorizzati.
Che cos’è MySQLi?
MySQLi è un’estensione migliorata di PHP (la lettera “i” sta per “improved”) per l’accesso alle banche dati MySQL. MySQL è uno dei sistemi di gestione di database relazionali (DBMS) più popolari al mondo insieme a Oracle e Microsoft SQL Server. I database relazionali sono un elemento centrale di Internet, perché rendono possibile l’elaborazione e l’archiviazione permanente di grandi quantità di dati. In questo modo, le basi di dati complessi vengono suddivise in sottoinsiemi e, se necessario, messe in relazione tra loro.
Il software, sviluppato nel 1994 dalla società svedese MySQL AB, è ora distribuito da Oracle Corporation attraverso un sistema di licenza duale: oltre alla versione proprietaria Enterprise, Oracle offre una versione open source con licenza GPL. Questa doppia licenza dà alle aziende la possibilità di sviluppare le proprie applicazioni basate su MySQL senza dover sottostare alla licenza open source.
Cosa comprende l’estensione mysqli?
In PHP ci sono tre diversi modi per accedere a un database MySQL. Il più datato prevedeva l’utilizzo dell’estensione MySQL, che però da PHP 5.5 è stata contrassegnata come deprecata e completamente rimossa in PHP 7. In PHP 7 la funzione mysql() non funziona più ed è stata sostituita da mysqli().
Per l’accesso alla banca dati MySQL, PHP dispone dei PHP Data Objects (PDO), che sono particolarmente dinamici nell’applicazione. La terza variante utilizza la MySQL Improved Extension. A partire da PHP 5, l’estensione mysqli consente l’accesso alle banche dati MySQL. Il seguente snippet di codice vi può dare un’idea di MySQLi.
Snippet di codice: inviare una query SQL al database
Il metodo query($sql) viene utilizzato per inviare le query al database:
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_errno) {
die("connessione fallita: " . $mysqli->connect_error);
}
$sql = "UPDATE tabella SET colonna = 'Valore' WHERE id = 1";
$mysqli->query($sql);
?>
Quali vantaggi offre MySQLi?
A differenza del suo predecessore, l’estensione mysqli può essere utilizzata non solo in modo procedurale, ma anche orientato agli oggetti. Un vantaggio della programmazione orientata agli oggetti è che una volta che il codice è stato scritto, può essere facilmente mantenuto e modificato in futuro, perché, per esempio, si possono progettare nuove classi che ereditano proprietà e comportamenti dalle classi esistenti. Questo riduce notevolmente i tempi di sviluppo e facilita l’adattamento del programma a un ambiente in continua evoluzione o a nuove esigenze.
Un altro grande vantaggio di MySQLi sono i Prepared Statement. Un Prepared Statement è un insieme di istruzioni preparate per un sistema di database. A differenza degli statement ordinari, questo non contiene ancora i valori dei parametri, ma i placeholder. Se uno statement con parametri diversi deve essere eseguito più volte sul sistema di database (ad esempio all’interno di un ciclo), i Prepared Statement possono portare un vantaggio in termini di velocità, poiché lo statement è già pretradotto nel sistema di database e deve essere eseguito solo con i nuovi parametri. Inoltre, i Prepared Statement possono prevenire efficacemente le SQL Injections perché il sistema di database controlla la validità dei parametri prima che vengano elaborati.
Snippet di codice: Prepared Statement in MySQLi
Un esempio di Prepared Statement in MySQLi si presenta nel modo seguente:
<?php
$mysqli = new mysqli("localhost", "user", "Password", "database");
if ($mysqli->connect_errno) {
die("connessione fallita: " . $mysqli->connect_error);
}
$sql = "UPDATE user SET email = ?, password = ? WHERE id = ?";
$statement = $mysqli->prepare($sql);
$statement->bind_param('ssi', $email, $password, $id);
//Assegnare dei valori alle variabili
$id= 1;
$email = "un@esempio.it";
$password = "nuova password";
$statement->execute();
?>
Con bind_param() i parametri nella query SQL sono collegati alle variabili. Il primo argomento di bind_param() nell’esempio con il valore ssi descrive i tipi di parametri. ssi indica che ci sono tre parametri nella query: il primo di tipo string, il secondo di tipo string e il terzo di tipo integer. Il valore d esiste ancora per i numeri a virgola mobile.
Dopo che le variabili sono state collegate ai parametri, il valore corrispondente viene assegnato a esse e il Prepared Statement viene inviato al database tramite $statement->execute(). In confronto ai PDO questo è molto più complicato.
- Massima sicurezza dei tuoi dati
- Strumenti di collaborazione per lavorare in team
- Aggiornamenti automatici
mysqli() vs mysql(): perché è stata modificata la funzione PHP?
Il passaggio a MySQLi è stato inevitabile, perché la vecchia estensione mysql era ormai divenuta obsoleta. Inoltre, l’estensione è stata sempre progettata con retrocompatibilità, con l’evidente difficoltà di mantenere il codice. Il codice risale ai primi tempi di PHP e MySQL e non è stato sviluppato del tutto in modo ottimale.
Quando, ad esempio, non veniva specificata alcuna risorsa di connessione esplicita, tutte le funzioni cercavano di utilizzare l’ultima connessione utilizzata. Nel caso peggiore poteva anche accadere che mysql_query() accedesse a un database completamente diverso. L’identificatore di connessione era opzionale nella vecchia funzione, mentre nella nuova estensione deve essere specificato. Inoltre, sono state aggiunti dei Prepared Statement per rendere più veloce e sicura la lettura dei dati della tabella del database.
Praticamente, molte funzioni possono essere modificate semplicemente aggiungendo una i alla funzione mysql(). Tuttavia, ci sono anche alcune differenze tra le due estensioni.
Snippet di codice: identificatore di connessione in MySQL e MySQLi
Alcune funzioni mysqli() richiedono un identificatore di connessione, ovvero una variabile PHP che viene creata durante la connessione al database. In questo esempio tale identificatore si chiama: $link.
<?php
// mysql() tentativo di connessione:
mysql_connect("localhost", "root", "", "test");
// mysqli() tentative di connessione:
$link = mysqli_connect("localhost", "root", "", "test");
?>
Snippet di codice: estrarre i dati dalla tabella del database
La funzione mysqli_query() ha bisogno di un identificatore di connessione, al contrario della funzione mysqli_fetch_array().
<?php
$link = mysqli_connect("localhost", "root", "", "test");
// Estrai set di dati:
$setdidati = mysqli_query($link,
"SELECT 'nome', 'testo', 'data' FROM 'notizie'");
// Estrai set di dati:
while (list($nome, $testo, $data) = mysqli_fetch_array($setdidati)) {
echo "<p>$nome - $titolo- $testo - $data</p>";
}
?>
Oltre a quella già menzionata, anche le seguenti funzioni richiedono un identificatore di connessione:
Conclusione: MySQLi è più sicuro e veloce
Il passaggio a MySQLi è stato necessario per migliorare la velocità di accesso al database. Nella nuova estensione sono stati introdotti i Prepared Statement, che aumentano anche la sicurezza della connessione impedendo le SQL Injections. Il sistema di database controlla se i parametri sono validi prima di essere elaborati. Inoltre, grazie alla programmazione orientata agli oggetti, il nuovo codice può essere mantenuto meglio.