Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 7 di 56
  • livello intermedio
Indice lezioni

Query multiple con MySQLi

Effettuare Insert o Update multiple con PHP minimizzando il numero di connessioni al DB, anche con il supporto dei prepared statement.
Effettuare Insert o Update multiple con PHP minimizzando il numero di connessioni al DB, anche con il supporto dei prepared statement.
Link copiato negli appunti

Non è infrequente che si presenti l'esigenza di effettuare inserimenti o modifiche multiple in una tabella e ci sono diversi modi per ovviare al problema, in base alle abitudini di programmazione e agli strumenti che abbiamo a disposizione. In questa lezione vediamo come utilizzare il metodo multi_query della classe mysqli.

Inserimento multiplo con mysqli::multi_query

Supponiamo che il nostro problema sia quello di inserire un certo numero di coppie "nome-utente+password" nella tabella del database che stiamo utilizzando e scriviamo una semplice funzione che genera stringhe random per creare le password:

function generaStringaRandom($length) {
	$caratteri = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
	$password = '';
	for ($i = 0; $i < $length; $i++) {
		$password .= $caratteri[rand(0, strlen($caratteri) - 1)];
	}
	return $password;
}

I dati da inserire sono invece i seguenti:

$user1='user1';
$pass1= hash('sha256', generaStringaRandom(20));
$user2='user2';
$pass2= hash('sha256', generaStringaRandom(20));
$user3='user3';
$pass3= hash('sha256', generaStringaRandom(20));
$sql ='insert into login (user, password) Values("'.user1.'", "'.pass1.'");';
$sql.='insert into login (user, password) Values("'.user2.'", "'.pass2.'");';
$sql.='insert into login (user, password) Values("'.user3.'", "'.pass3.'");';

Prepariamo la nostra solita connessione al database:

$mysqli = new mysqli('localhost', 'root', 'root', 'biblioteca');
if ($mysqli->connect_error) {
    die('Errore di connessione ('.$mysqli->connect_errno.')'.$mysqli->connect_error);
}

E a questo punto possiamo effettuare gli inserimenti sfruttando il metodo multi_query():

$mysqli->multi_query($sql);

Potrebbe essere una buona idea inserire un piccolo controllo per sapere se tutte le operazioni sono andate a buon fine o, viceversa, mostrare un messaggio di errore:

if ($mysqli->multi_query($sql) === TRUE) {
    echo "Inserimento terminato correttamente";
} else {
    echo "Errore in fase di inserimento:" . $mysqli->error;
}

E infine, come buona pratica, la chiusura della connessione

$mysqli->close();

Questa soluzione porta come vantaggio quello di ridurre il carico client-server, in cambio richiede l'attenzione di separare le varie query SQL da eseguire con il punto e virgola. Lo svantaggio risiede nel fatto che non stiamo usando query parametriche, la seconda soluzione quindi sarà orientata in questa direzione.

Inserimenti multipli e prepared statements

Supponiamo di avere già a disposizione connessione e dati dall'esempio precedente.

Prepariamo la nostra query:

$query = $mysqli->prepare("INSERT INTO login(user, password) values(?,?)");

Procediamo con il bind dei parametri

$query->bind_param("ss", $user, $password);

A questo punto procediamo con l'assegnazione dei valori e l'esecuzione:

$user = $user1;
$password = $pass1;
$query->execute();

Nello stesso modo procediamo con gli altri INSERT.

$user=$user2;
$password=$pass2;
$query->execute();
$user=$user3;
$password=$pass3;
$query->execute();

Non resta quindi che chiudere la connessione:

$mysqli>close();

Ti consigliamo anche