Записать в MySql данные из 100 полей формы?
У меня есть форма, в которой предположим 100 полей с типом text:
<input name="x1" type="text">
<input name="x2" type="text">
<input name="x3" type="text">
...
<input name="x100" type="text">
Есть база mysql со 100 колонками, названия повторяют форму выше. Как отправить значения из этих 100 полей в БД, но так чтобы не назначать для каждого поле переменную. Сейчас я могу сделать примерно так:
// Переменные с формы
$x1 = $_POST['x1'];
$x2 = $_POST['x2'];
...
$x100 = $_POST['x100'];
// Параметры для подключения
$db_host = "localhost";
$db_user = ""; // Логин БД
$db_password = ""; // Пароль БД
$db_base = ''; // Имя БД
$db_table = "mytable"; // Имя Таблицы БД
// Подключение к базе данных
$mysqli = new mysqli($db_host,$db_user,$db_password,$db_base);
// Если есть ошибка соединения, выводим её и убиваем подключение
if ($mysqli->connect_error) {
die('Ошибка : ('. $mysqli->connect_errno .') '. $mysqli->connect_error);
}
$result = $mysqli->query("INSERT INTO ".$db_table." (x1,x2,..,x100) VALUES ('$x1','$x2',...,'$x100')");
if ($result == true){
echo "Информация занесена в базу данных";
}else{
echo "Информация не занесена в базу данных";
Можно ли как-то получить все значения разом из формы и отправить БД? Или хоть как-то упростить этот процесс и избежать ввода 100 параметров?
Я новичок, но есть идея и я обдумываю как её реализовать. Большое спасибо.
Ответы (1 шт):
Валидировать 100 параметров все равно придётся. Мало ли что приедет в ПОСТе. Так что по разу написать каждое имя поля всё равно придётся.
Можно например сделать так: завести массив с разрешенными именами полей, и проверять входящие данные на соответствие этому массиву, чтобы гарантировать, что в списке полей нет ошибок и инъекций..
Ну, и как правильно написали в комментах, сами данные должны ехать через плейcхолдеры. С учетом этих вводных можно написать функцию
function DBinsert($mysqli, $table, array $data, array $allowed)
{
$keys = array_keys($data);
if (array_diff($keys, $allowed)) {
throw new ErrorException('Incorrect field name');
}
$keys_str = '`'.implode('`,`', $keys).'`';
$values_str = str_repeat('?,', count($keys) - 1) . '?';
$stmt = $mysqli->prepare("INSERT INTO `$table` ($keys_str) VALUES ($values_str)");
$types = $types ?: str_repeat("s", count($data));
$stmt->bind_param($types, ...array_values($data));
$stmt->execute();
}
Ну и соответственно вызывать её как-то так:
unset($_POST['submit']); // убираем из поста всё лишнее
$allowed = ['name', 'password','email', 'access', 'status'];
DBinsert($mysqli, 'users', $_POST, $allowed);