Dynamisch voorbereide zoekopdrachten
U kunt uw zoekopdracht dynamisch opbouwen vanuit de $_POST-array:
Maar vertrouw NOOIT gebruikersinvoer, wat betekent dat u er niet op kunt vertrouwen dat gegevens in $_POST geldige kolomnamen bevatten.
U kunt een array van kolomnamen op de witte lijst definiëren $whitelist = array('field1', 'field2', ...)
, en gebruik dan:
$data = array_intersect_key($_POST, array_flip($whitelist));
om de kruising te vinden tussen de kolommen op de witte lijst en uw $_POST-array. (Bedankt @BillKarwin)
private function buildInsertSql($data, $table) {
$columns = "";
$holders = "";
foreach ($data as $column => $value) {
$columns .= ($columns == "") ? "" : ", ";
$columns .= $column;
$holders .= ($holders == "") ? "" : ", ";
$holders .= ":$column";
}
$sql = "INSERT INTO $table ($columns) VALUES ($holders)";
return $sql;
}
Dit geeft je een SQL-statement van de vorm:
$sql = INSERT INTO directory (field1, field2) VALUES (:field1, :field2)
en bereid de verklaring voor:
$stmt = $dbh->prepare($sql);
U kunt dan dynamisch parameters aan de tijdelijke aanduidingen binden:
foreach ($data as $placeholder => $value) {
$stmt->bindValue(":$placeholder", $value);
}
en voer het uit:
$stmt->execute();
Een beetje geavanceerder...
- Bekijk deze link Binnend op dezelfde tijdelijke aanduiding Voor informatie over hoe u uw dynamisch voorbereide verklaring robuuster kunt maken.
- Bekijk deze link:Bind Params Inside Loop Voor een waarschuwing met betrekking tot bindende parameters versus waarden in een lus.