Come per quasi tutte le domande "Come faccio a eseguire SQL da PHP" - Tu davvero dovrebbe utilizzare dichiarazioni preparate. Non è così difficile:
$ids = array(2, 4, 6, 8);
// prepare an SQL statement with a single parameter placeholder
$sql = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = ?";
$stmt = $mysqli->prepare($sql);
// bind a different value to the placeholder with each execution
for ($i = 0; $i < count($ids); $i++)
{
$stmt->bind_param("i", $ids[$i]);
$stmt->execute();
echo "Updated record ID: $id\n";
}
// done
$stmt->close();
In alternativa, puoi farlo in questo modo:
$ids = array(2, 4, 6, 8);
// prepare an SQL statement with multiple parameter placeholders
$params = implode(",", array_fill(0, count($ids), "?"));
$sql = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id IN ($params)";
$stmt = $mysqli->prepare($sql);
// dynamic call of mysqli_stmt::bind_param hard-coded eqivalent
$types = str_repeat("i", count($ids)); // "iiii"
$args = array_merge(array($types), $ids); // ["iiii", 2, 4, 6, 8]
call_user_func_array(array($stmt, 'bind_param'), ref($args)); // $stmt->bind_param("iiii", 2, 4, 6, 8)
// execute the query for all input values in one step
$stmt->execute();
// done
$stmt->close();
echo "Updated record IDs: " . implode("," $ids) ."\n";
// ----------------------------------------------------------------------------------
// helper function to turn an array of values into an array of value references
// necessary because mysqli_stmt::bind_param needs value refereces for no good reason
function ref($arr) {
$refs = array();
foreach ($arr as $key => $val) $refs[$key] = &$arr[$key];
return $refs;
}
Aggiungi altri segnaposto di parametri per altri campi quando ne hai bisogno.
Quale scegliere?
-
La prima variante funziona con un numero variabile di record in modo iterativo, colpendo il database più volte. Questo è molto utile per le operazioni di UPDATE e INSERT.
-
La seconda variante funziona anche con un numero variabile di record, ma colpisce il database solo una volta. Questo è molto più efficiente dell'approccio iterativo, ovviamente puoi fare la stessa cosa solo su tutti i record interessati. Questo è molto utile per le operazioni SELECT ed DELETE, o quando vuoi AGGIORNARE più record con gli stessi dati.
Perché le dichiarazioni preparate?
- Le istruzioni preparate sono molto più sicure perché rendono impossibili gli attacchi SQL injection. Questo è il motivo principale per utilizzare le dichiarazioni preparate, anche se è più faticoso scriverle. Un'abitudine sensata da prendere è:usa sempre affermazioni preparate, anche se pensi che "non sia realmente necessario". La negligenza verrà e morderà te (o i tuoi clienti).
- Il riutilizzo della stessa istruzione preparata più volte con valori di parametro diversi è più efficiente rispetto all'invio di più stringhe SQL complete al database, poiché il database deve compilare l'istruzione solo una volta e può anche riutilizzarla.
- Solo i valori dei parametri vengono inviati al database su
execute(), quindi meno dati devono passare attraverso il cavo se utilizzati ripetutamente.
In cicli più lunghi la differenza di tempo di esecuzione tra l'utilizzo di un'istruzione preparata e l'invio di un semplice SQL diventerà evidente.