Zoals met bijna alle "Hoe doe ik SQL vanuit PHP"-vragen - Jij echt voorbereide verklaringen moeten gebruiken. Het is niet zo moeilijk:
$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();
U kunt het ook als volgt doen:
$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;
}
Voeg meer tijdelijke aanduidingen voor parameters toe voor andere velden als u ze nodig heeft.
Welke te kiezen?
-
De eerste variant werkt iteratief met een variabel aantal records, waarbij de database meerdere keren wordt geraakt. Dit is vooral handig voor UPDATE- en INSERT-bewerkingen.
-
De tweede variant werkt ook met een variabel aantal records, maar komt maar één keer in de database terecht. Dit is veel efficiënter dan de iteratieve benadering, u kunt uiteraard alleen hetzelfde doen voor alle betrokken records. Dit is vooral handig voor SELECT- en DELETE-bewerkingen, of wanneer u meerdere records met dezelfde gegevens wilt BIJWERKEN.
Waarom verklaringen opgesteld?
- Voorbereide instructies zijn een stuk veiliger omdat ze SQL-injectie-aanvallen onmogelijk maken. Dit is de belangrijkste reden om voorbereide verklaringen te gebruiken, zelfs als het meer werk is om ze te schrijven. Een verstandige gewoonte om in te stappen is:Gebruik altijd voorbereide uitspraken, ook als je denkt dat het 'niet echt nodig is'. Verwaarlozing zal u (of uw klanten) komen bijten.
- Het meerdere keren hergebruiken van dezelfde voorbereide instructie met verschillende parameterwaarden is efficiënter dan het verzenden van meerdere volledige SQL-strings naar de database, omdat de database de instructie maar één keer hoeft te compileren en deze ook opnieuw kan gebruiken. li>
- Alleen parameterwaarden worden naar de database verzonden op
execute()
, zodat er minder gegevens over de kabel hoeven te gaan bij herhaaldelijk gebruik.
In langere loops zal het verschil in uitvoeringstijd tussen het gebruik van een voorbereide instructie en het verzenden van gewone SQL merkbaar worden.