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();