Stejně jako u téměř všech otázek „Jak udělám SQL z PHP“ – skutečně měli používat připravená prohlášení. Není to tak těžké:
$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();
Případně to můžete udělat takto:
$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;
}
Podle potřeby přidejte další zástupné symboly parametrů pro další pole.
Který vybrat?
-
První varianta pracuje s proměnným počtem záznamů iterativně, přičemž do databáze zasáhne vícekrát. To je nejužitečnější pro operace UPDATE a INSERT.
-
Druhá varianta pracuje také s proměnným počtem záznamů, ale do databáze zasáhne pouze jednou. To je mnohem efektivnější než iterativní přístup, zjevně můžete udělat to samé se všemi dotčenými záznamy. To je nejužitečnější pro operace SELECT a DELETE nebo když chcete AKTUALIZOVAT více záznamů se stejnými daty.
Proč připravená prohlášení?
- Připravené příkazy jsou mnohem bezpečnější, protože znemožňují útoky SQL injection. To je primární důvod, proč používat připravené příkazy, i když je pracnější je napsat. Rozumným zvykem je:Vždy používejte připravená prohlášení, i když si myslíte, že to „není opravdu nutné“. Zanedbání přijde a kousne vás (nebo vaše zákazníky).
- Opětovné použití stejného připraveného příkazu vícekrát s různými hodnotami parametrů je efektivnější než posílání více úplných SQL řetězců do databáze, protože databáze stačí zkompilovat příkaz pouze jednou a může jej také znovu použít. li>
- Pouze hodnoty parametrů jsou odesílány do databáze pomocí
execute()
, takže při opakovaném použití je potřeba procházet kabelem méně dat.
V delších cyklech bude časový rozdíl mezi použitím připraveného příkazu a odesláním prostého SQL patrný.