Codice PHP:
// Checks whether "fir" is a duplicate
$query = 'SELECT COUNT(*) AS is_present FROM liquidi WHERE fir = ?';
$stmt = mysqli_prepare($conn, $query);
if (!$stmt) {
die("Cannot prepare query: " . mysqli_error($conn));
}
mysqli_stmt_bind_param($stmt, "s", $fir);
if (!myaqli_stmt_execute($stmt)) {
die("Cannot execute statement: " . mysqli_error($conn));
}
mysqli_stmt_bind_result($stmt, $row);
mysqli_stmt_close($stmt);
Qui viene controllato se esiste già una riga che contiene il
fir indicato. Vengono usati i
prepared statement di
mysqli per evitare attacchi
MySQL Injection.
La prima riga definisce il testo della
query: si seleziona il numero di righe nella tabella
liquidi in cui
fir ha il valore che si intende testare. Il numero di righe viene selezionato tramite la funzione
COUNT di SQL. Questo è più efficiente rispetto a selezionare tutte le righe per poi contarle, in quanto viene restituito un singolo numero anziché un insieme di risultati.
$stmt sta per
statement, il tipo di dato al centro dei
prepared statement, e viene generato chiamando
mysqli_prepare. Naturalmente alla riga seguente vi è un controllo su eventuali errori.
Tramite la funzione
mysqli_stmt_bind_param il valore di
$fir viene "inserito" nel segnaposto della
query usata per preparare lo
statement. La stringa
"s" indica che viene usato un solo parametro di tipo stringa. Se le variabili da "inserire" fossero state tre, due stringhe e un intero, il codice sarebbe stato
"ssd". Uno dei vantaggi dell'uso di questa funzione è che provvede automaticamente a "sanificare" i parametri passati, evitando
SQL Injection.
Non so dove tu abbia letto che questa funzione sia stata eliminata dopo PHP 5.4, come puoi vedere dalla documentazione non è così. Forse ti confondi con
mysqli_bind_param (di cui, per qualche motivo, esiste solo la pagina di documentazione in spagnolo), la quale era un alias successivamente rimosso dal linguaggio.
Dopo
mysqli_stmt_bind_param, lo
statement viene eseguito chiamando
mysqli_stmt_execute. Nella stessa riga ne viene controllato il valore restituito per identificare la presenza di errori.
La funzione
mysqli_stmt_bind_result serve a leggere il risultato della
query e scriverlo nella variabile
$row, che viene contestualmente creata e inizializzata.
Infine,
mysqli_stmt_close non fa altro che indicare che l'utilizzo dello
statement è terminato, e la memoria può essere liberata.
Il codice per la
query di inserimento è del tutto analogo:
Codice PHP:
$query = 'INSERT INTO liquidi (omologa, data_arrivo, cer, fir) VALUES (?, ?, ?, ?)';
$stmt = mysqli_prepare($conn, $query);
if (!$stmt) {
die("Cannot prepare query: " . mysqli_error($conn));
}
mysqli_stmt_bind_param($stmt, "ssss", $omologa, $data_arrivo, $cer, $fir);
if (!myaqli_stmt_execute($stmt)) {
die("Cannot execute statement: " . mysqli_error($conn));
}
mysqli_stmt_close($stmt);
Le uniche differenze significative sono il numero di segnaposto
"?" nella
query, che diventano quattro (poiché quattro sono i parametri da inserire). Di conseguenza, a
mysqli_stmt_bind_param viene passato
"ssss" come secondo parametro, perché i valori da inserire sono quattro, e tutti di tipo
stringa.
In questo caso non è presente
mysqli_stmt_bind_result, poiché si stratta di un inserimento, quindi non c'è alcun risultato da leggere.