Записать в 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);
→ Ссылка