Zrobiłbym to w ten sposób:
Najpierw zadeklaruj kolumny. Wykorzystamy je, aby wyodrębnić podzbiór $_POST do wykorzystania jako kolumny. W przeciwnym razie użytkownik mógłby przekazać fałszywe parametry żądania, które nie pasują do żadnych kolumn tabeli, co złamałoby nasz SQL.
$columns = array('username','email','password','name');
$column_list = join(',', $columns);
Utwórz symbole zastępcze parametrów nazwanych, np. :username
.
$param_list = join(',', array_map(function($col) { return ":$col"; }, $columns));
Utwórz SQL oddzielnie, ponieważ jest łatwiejszy do odczytania i debugowania, jeśli znajduje się we własnej zmiennej.
$sql = "INSERT INTO `applications` ($column_list) VALUES ($param_list)";
Zawsze sprawdź status błędu zwrócony przez prepare()
i execute()
.
$statement = $db->prepare($sql);
if ($statement === false) {
die(print_r($db->errorInfo(), true));
}
Tutaj bierzemy tylko pola $_POST, które pasują do kolumn, które chcemy wstawić.
$param_values = array_intersect_key($_POST, array_flip($columns));
I przekaż tę tablicę do execute()
. Ponownie sprawdź status zwrotu błędu.
$status = $statement->execute($param_values);
if ($status === false) {
die(print_r($statement->errorInfo(), true));
}