Lo farei in questo modo:
Dichiara prima le colonne. Li useremo per estrarre un sottoinsieme di $ _POST da utilizzare come colonne. Altrimenti un utente potrebbe passare parametri di richiesta fasulli che non corrispondono a nessuna colonna della tabella, il che interromperebbe il nostro SQL.
$columns = array('username','email','password','name');
$column_list = join(',', $columns);
Crea segnaposto di parametri denominati, ad esempio :username
.
$param_list = join(',', array_map(function($col) { return ":$col"; }, $columns));
Forma l'SQL separatamente, perché è più facile da leggere ed eseguire il debug se è nella sua stessa variabile.
$sql = "INSERT INTO `applications` ($column_list) VALUES ($param_list)";
Sempre controlla lo stato di errore restituito da prepare()
e execute()
.
$statement = $db->prepare($sql);
if ($statement === false) {
die(print_r($db->errorInfo(), true));
}
Qui prendiamo solo i campi di $_POST che corrispondono alle colonne che vogliamo inserire.
$param_values = array_intersect_key($_POST, array_flip($columns));
E passa quell'array a execute()
. Ancora una volta, controlla lo stato di restituzione dell'errore.
$status = $statement->execute($param_values);
if ($status === false) {
die(print_r($statement->errorInfo(), true));
}