Query preparate dinamiche
Puoi creare la tua query in modo dinamico dall'array $_POST:
Ma NON fidarti MAI dell'input dell'utente, il che significa che non puoi fidarti del fatto che i dati in $_POST conterranno nomi di colonne validi.
Puoi definire un array di nomi di colonne nella whitelist $whitelist = array('field1', 'field2', ...)
, quindi usa:
$data = array_intersect_key($_POST, array_flip($whitelist));
per trovare l'intersezione tra le colonne autorizzate e l'array $_POST. (Grazie @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;
}
Questo ti darà un'istruzione SQL del modulo:
$sql = INSERT INTO directory (field1, field2) VALUES (:field1, :field2)
e preparare la dichiarazione:
$stmt = $dbh->prepare($sql);
È quindi possibile associare dinamicamente i parametri ai segnaposto:
foreach ($data as $placeholder => $value) {
$stmt->bindValue(":$placeholder", $value);
}
ed eseguilo:
$stmt->execute();
Un po' più avanzato...
- Dai un'occhiata a questo link Associazione allo stesso segnaposto Per informazioni su come rendere più solida la tua dichiarazione preparata dinamica.
- Dai un'occhiata a questo link:Collega parametri all'interno del ciclo Per un avvertimento relativo ai parametri vincolanti rispetto ai valori in un ciclo.