Dynamiskt förberedda frågor
Du kan bygga din fråga dynamiskt från $_POST-arrayen:
Men lita ALDRIG på användarinmatning, vilket betyder att du inte kan lita på att data i $_POST kommer att innehålla giltiga kolumnnamn.
1. Rensa inläggsdata
Du kan definiera en array med vitlistade kolumnnamn $whitelist = array('field1', 'field2', ...)
, och använd sedan:
$data = array_intersect_key($_POST, array_flip($whitelist));
för att hitta skärningspunkten mellan de vitlistade kolumnerna och din $_POST-array. (Tack @BillKarwin)
2. Skapa frågan
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;
}
Detta ger dig en SQL-sats i formen:
$sql = INSERT INTO directory (field1, field2) VALUES (:field1, :field2)
och förbered uttalandet:
$stmt = $dbh->prepare($sql);
3. Bindningsparametrar
Du kan sedan dynamiskt binda parametrar till platshållarna:
foreach ($data as $placeholder => $value) {
$stmt->bindValue(":$placeholder", $value);
}
och kör det:
$stmt->execute();
Lite mer avancerat...
- Ta en titt på den här länken Bindar till samma platshållare För information om hur du gör ditt dynamiskt förberedda uttalande mer robust.
- Ta en titt på den här länken:Bind Params Inside Loop För en varning angående bindning av paramatrar kontra värden i en loop.