# 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.

## Che cos’è MySQLi?

MySQLi è un’estensione migliorata di [PHP](https://www.ionos.it/digitalguide/siti-web/creare-siti/imparare-a-programmare-in-php-tutorial-per-principianti/ "Imparare a programmare in PHP: tutorial per principianti") (la lettera “i” sta per “improved”) per l’accesso alle banche dati MySQL. [MySQL](https://www.ionos.it/digitalguide/server/know-how/imparare-a-utilizzare-mysql-guida-per-principianti/ "Imparare a utilizzare MySQL: guida per principianti") è uno dei [sistemi di gestione di database relazionali (DBMS)](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/sistema-di-gestione-di-base-di-dati-dbms/ "Sistema di gestione di base di dati (DBMS)") più popolari al mondo insieme a Oracle e Microsoft SQL Server. I [database relazionali](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/database-relazionale/ "Database relazionale") 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](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/database/ "Database"):

```none
<?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](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/prepared-statement-in-php-mysql/ "Prepared Statement in PHP MySQL") è 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](https://www.ionos.it/digitalguide/server/sicurezza/sql-injection-che-cose-e-come-proteggersi/ "SQL injection: che cos’è e come proteggersi") 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:

```none
<?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-&gt;execute()*. In confronto ai PDO questo è molto più complicato.

## 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*.

```none
<?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()*.

```none
<?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:

- [*mysqli\_set\_charset()*](https://www.php.net/manual/it/mysqli.set-charset.php)
- [*mysqli\_real\_escape\_string()*](https://www.php.net/manual/it/mysqli.real-escape-string.php)
- [*mysqli\_insert\_id()*](https://www.php.net/manual/it/mysqli.insert-id.php)

## 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.


This is a markdown version of: [https://www.ionos.it/digitalguide/hosting/tecniche-hosting/presentazione-di-mysqli/](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/presentazione-di-mysqli/) for AI/LLM consumption.