Requêtes préparées dynamiques
Vous pouvez construire votre requête dynamiquement à partir du tableau $_POST :
Mais, ne faites JAMAIS confiance à l'entrée de l'utilisateur, ce qui signifie que vous ne pouvez pas être sûr que les données de $_POST contiendront des noms de colonne valides.
Vous pouvez définir un tableau de noms de colonnes en liste blanche $whitelist = array('field1', 'field2', ...)
, puis utilisez :
$data = array_intersect_key($_POST, array_flip($whitelist));
pour trouver l'intersection entre les colonnes de la liste blanche et votre tableau $_POST. (Merci @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;
}
Cela vous donnera une instruction SQL de la forme :
$sql = INSERT INTO directory (field1, field2) VALUES (:field1, :field2)
et préparez la déclaration :
$stmt = $dbh->prepare($sql);
Vous pouvez ensuite lier dynamiquement les paramètres aux espaces réservés :
foreach ($data as $placeholder => $value) {
$stmt->bindValue(":$placeholder", $value);
}
et exécutez-le :
$stmt->execute();
Un peu plus avancé...
- Jetez un œil à ce lien Liaison au même espace réservé Pour plus d'informations sur la façon de rendre votre instruction préparée dynamique plus robuste.
- Consultez ce lien :Lier les paramètres à l'intérieur de la boucle Pour une mise en garde concernant les paramètres de liaison par rapport aux valeurs dans une boucle.