PHP in­ter­rom­pe­rà presto il supporto per MySQL? È proprio questa domanda ad aver generato in­cer­tez­za nella comunità PHP, in seguito a un messaggio di errore apparso dopo il col­le­ga­men­to a un server MySQL ef­fet­tua­to con la vecchia esten­sio­ne mysql, che rac­co­man­da­va tra l’altro il passaggio a ext/mysqli. Questo “avviso di de­pre­ca­zio­ne” (De­pre­ca­tion Notice) è stato emesso a partire da PHP 5.5, ma l’esten­sio­ne mysqli è stata in­tro­dot­ta già con PHP 5.0. Vi ri­cor­dia­mo: era il 2004.

Perché questa in­cer­tez­za? 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 de­pre­ca­zio­ne. Così, con l’in­tro­du­zio­ne di PHP 7, l’esten­sio­ne mysql è stata di­sat­ti­va­ta de­fi­ni­ti­va­men­te. In questo articolo vi pre­sen­tia­mo MySQLi nel dettaglio con esempi e ap­pro­fon­dia­mo le dif­fe­ren­ze tra le due esten­sio­ni.

IONOS Cloud Object Storage
Ar­chi­via­zio­ne sicura e a prezzi van­tag­gio­si

Archivia i tuoi dati in tutta sicurezza sui nostri server, e pro­teg­gi­li dagli accessi non au­to­riz­za­ti.

Che cos’è MySQLi?

MySQLi è un’esten­sio­ne mi­glio­ra­ta di PHP (la lettera “i” sta per “improved”) per l’accesso alle banche dati MySQL. MySQL è uno dei sistemi di gestione di database re­la­zio­na­li (DBMS) più popolari al mondo insieme a Oracle e Microsoft SQL Server. I database re­la­zio­na­li sono un elemento centrale di Internet, perché rendono possibile l’ela­bo­ra­zio­ne e l’ar­chi­via­zio­ne per­ma­nen­te di grandi quantità di dati. In questo modo, le basi di dati complessi vengono suddivise in sot­toin­sie­mi e, se ne­ces­sa­rio, messe in relazione tra loro.

Il software, svi­lup­pa­to nel 1994 dalla società svedese MySQL AB, è ora di­stri­bui­to da Oracle Cor­po­ra­tion at­tra­ver­so un sistema di licenza duale: oltre alla versione pro­prie­ta­ria En­ter­pri­se, Oracle offre una versione open source con licenza GPL. Questa doppia licenza dà alle aziende la pos­si­bi­li­tà di svi­lup­pa­re le proprie ap­pli­ca­zio­ni basate su MySQL senza dover sot­to­sta­re alla licenza open source.

Cosa comprende l’esten­sio­ne mysqli?

In PHP ci sono tre diversi modi per accedere a un database MySQL. Il più datato prevedeva l’utilizzo dell’esten­sio­ne MySQL, che però da PHP 5.5 è stata con­tras­se­gna­ta come deprecata e com­ple­ta­men­te rimossa in PHP 7. In PHP 7 la funzione mysql() non funziona più ed è stata so­sti­tui­ta da mysqli().

Per l’accesso alla banca dati MySQL, PHP dispone dei PHP Data Objects (PDO), che sono par­ti­co­lar­men­te dinamici nell’ap­pli­ca­zio­ne. La terza variante utilizza la MySQL Improved Extension. A partire da PHP 5, l’esten­sio­ne 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 uti­liz­za­to 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 dif­fe­ren­za del suo pre­de­ces­so­re, l’esten­sio­ne mysqli può essere uti­liz­za­ta non solo in modo pro­ce­du­ra­le, ma anche orientato agli oggetti. Un vantaggio della pro­gram­ma­zio­ne orientata agli oggetti è che una volta che il codice è stato scritto, può essere fa­cil­men­te mantenuto e mo­di­fi­ca­to in futuro, perché, per esempio, si possono pro­get­ta­re nuove classi che ereditano proprietà e com­por­ta­men­ti dalle classi esistenti. Questo riduce no­te­vol­men­te i tempi di sviluppo e facilita l’adat­ta­men­to del programma a un ambiente in continua evo­lu­zio­ne o a nuove esigenze.

Un altro grande vantaggio di MySQLi sono i Prepared Statement. Un Prepared Statement è un insieme di istru­zio­ni preparate per un sistema di database. A dif­fe­ren­za degli statement ordinari, questo non contiene ancora i valori dei parametri, ma i pla­ce­hol­der. 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à pre­tra­dot­to nel sistema di database e deve essere eseguito solo con i nuovi parametri. Inoltre, i Prepared Statement possono prevenire ef­fi­ca­ce­men­te le SQL In­jec­tions 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 cor­ri­spon­den­te viene assegnato a esse e il Prepared Statement viene inviato al database tramite $statement->execute(). In confronto ai PDO questo è molto più com­pli­ca­to.

Managed Nextcloud di IONOS Cloud
Lavora con il tuo team sul cloud
  • Massima sicurezza dei tuoi dati
  • Strumenti di col­la­bo­ra­zio­ne per lavorare in team
  • Ag­gior­na­men­ti au­to­ma­ti­ci

mysqli() vs mysql(): perché è stata mo­di­fi­ca­ta la funzione PHP?

Il passaggio a MySQLi è stato ine­vi­ta­bi­le, perché la vecchia esten­sio­ne mysql era ormai divenuta obsoleta. Inoltre, l’esten­sio­ne è stata sempre pro­get­ta­ta con re­tro­com­pa­ti­bi­li­tà, con l’evidente dif­fi­col­tà di mantenere il codice. Il codice risale ai primi tempi di PHP e MySQL e non è stato svi­lup­pa­to del tutto in modo ottimale.

Quando, ad esempio, non veniva spe­ci­fi­ca­ta alcuna risorsa di con­nes­sio­ne esplicita, tutte le funzioni cercavano di uti­liz­za­re l’ultima con­nes­sio­ne uti­liz­za­ta. Nel caso peggiore poteva anche accadere che mysql_query() accedesse a un database com­ple­ta­men­te diverso. L’iden­ti­fi­ca­to­re di con­nes­sio­ne era opzionale nella vecchia funzione, mentre nella nuova esten­sio­ne deve essere spe­ci­fi­ca­to. Inoltre, sono state aggiunti dei Prepared Statement per rendere più veloce e sicura la lettura dei dati della tabella del database.

Pra­ti­ca­men­te, molte funzioni possono essere mo­di­fi­ca­te sem­pli­ce­men­te ag­giun­gen­do una i alla funzione mysql(). Tuttavia, ci sono anche alcune dif­fe­ren­ze tra le due esten­sio­ni.

Snippet di codice: iden­ti­fi­ca­to­re di con­nes­sio­ne in MySQL e MySQLi

Alcune funzioni mysqli() ri­chie­do­no un iden­ti­fi­ca­to­re di con­nes­sio­ne, ovvero una variabile PHP che viene creata durante la con­nes­sio­ne al database. In questo esempio tale iden­ti­fi­ca­to­re 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 iden­ti­fi­ca­to­re di con­nes­sio­ne, 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à men­zio­na­ta, anche le seguenti funzioni ri­chie­do­no un iden­ti­fi­ca­to­re di con­nes­sio­ne:

Con­clu­sio­ne: MySQLi è più sicuro e veloce

Il passaggio a MySQLi è stato ne­ces­sa­rio per mi­glio­ra­re la velocità di accesso al database. Nella nuova esten­sio­ne sono stati in­tro­dot­ti i Prepared Statement, che aumentano anche la sicurezza della con­nes­sio­ne impedendo le SQL In­jec­tions. Il sistema di database controlla se i parametri sono validi prima di essere elaborati. Inoltre, grazie alla pro­gram­ma­zio­ne orientata agli oggetti, il nuovo codice può essere mantenuto meglio.

Vai al menu prin­ci­pa­le