Eu faria assim:
Declare as colunas primeiro. Vamos usá-los para extrair um subconjunto de $_POST para uso como colunas. Caso contrário, um usuário pode passar parâmetros de solicitação falsos que não correspondem a nenhuma coluna da tabela, o que quebraria nosso SQL.
$columns = array('username','email','password','name');
$column_list = join(',', $columns);
Crie espaços reservados para parâmetros nomeados, por exemplo,
:username
. $param_list = join(',', array_map(function($col) { return ":$col"; }, $columns));
Forme o SQL separadamente, pois é mais fácil de ler e depurar se estiver em sua própria variável.
$sql = "INSERT INTO `applications` ($column_list) VALUES ($param_list)";
Sempre verifique o status de erro retornado de
prepare()
e execute()
. $statement = $db->prepare($sql);
if ($statement === false) {
die(print_r($db->errorInfo(), true));
}
Aqui levamos somente os campos de $_POST que correspondem às colunas que queremos inserir.
$param_values = array_intersect_key($_POST, array_flip($columns));
E passe esse array para
execute()
. Novamente, verifique o status de retorno do erro. $status = $statement->execute($param_values);
if ($status === false) {
die(print_r($statement->errorInfo(), true));
}