Consultas dinámicas preparadas
Puede crear su consulta de forma dinámica a partir de la matriz $_POST:
Pero, NUNCA confíe en la entrada del usuario, lo que significa que no puede confiar en que los datos en $_POST contendrán nombres de columna válidos.
Puede definir una matriz de nombres de columna incluidos en la lista blanca $whitelist = array('field1', 'field2', ...)
y luego use:
$data = array_intersect_key($_POST, array_flip($whitelist));
para encontrar la intersección entre las columnas incluidas en la lista blanca y su matriz $_POST. (Gracias @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;
}
Esto le dará una declaración SQL de la forma:
$sql = INSERT INTO directory (field1, field2) VALUES (:field1, :field2)
y prepare la declaración:
$stmt = $dbh->prepare($sql);
A continuación, puede vincular dinámicamente los parámetros a los marcadores de posición:
foreach ($data as $placeholder => $value) {
$stmt->bindValue(":$placeholder", $value);
}
y ejecutarlo:
$stmt->execute();
Un poco más avanzado...
- Echa un vistazo a este enlace Enlace al mismo marcador de posición Para obtener información sobre cómo hacer que su declaración preparada dinámica sea más sólida.
- Echa un vistazo a este enlace:Enlazar parámetros dentro del bucle Para una advertencia con respecto a los parámetros vinculantes frente a los valores en un bucle.