PDO Ввод массива с использованием ключа в качестве имени столбца

Я вставляю содержимое $ _POST моего массива PHP в таблицу с PDO. Я смотрел на следующие строки кода, и у меня был один из тех, «должен быть лучший способ сделать это». Если имя ключа совпадает с именем столбца в таблице, есть ли более простой способ вставить его все?

Код, например:

$statement = $db->prepare("INSERT INTO `applications`(`username`, `email`, `password`, `name`) VALUES (?,?,?,?)"); $statement->execute(array($_POST['username'], $_POST['email'],$_POST['password'],$_POST['name'])); 

Этот код РАБОТАЕТ, но он просто немного перегружен (особенно при добавлении большего количества столбцов).

Я бы сделал это так:

Сначала объявите столбцы. Мы будем использовать их для извлечения подмножества $ _POST для использования в качестве столбцов. В противном случае пользователь может передать параметры фиктивного запроса, которые не соответствуют столбцам таблицы, что нарушит наш SQL.

 $columns = array('username','email','password','name'); $column_list = join(',', $columns); 

Создайте именованные параметры, например :username .

 $param_list = join(',', array_map(function($col) { return ":$col"; }, $columns)); 

Создайте SQL отдельно, потому что его легче читать и отлаживать, если он находится в собственной переменной.

 $sql = "INSERT INTO `applications` ($column_list) VALUES ($param_list)"; 

Всегда проверяйте статус ошибки, возвращаемый из prepare() и execute() .

 $statement = $db->prepare($sql); if ($statement === false) { die(print_r($db->errorInfo(), true)); } 

Здесь мы берем только поля $ _POST, которые соответствуют столбцам, которые мы хотим вставить.

 $param_values = array_intersect_key($_POST, array_flip($columns)); 

И передать этот массив для execute() . Снова проверьте статус возврата ошибки.

 $status = $statement->execute($param_values); if ($status === false) { die(print_r($statement->errorInfo(), true)); }