Я вставляю содержимое $ _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)); }