Вы можете использовать связанные параметры только для элемента, который будет постоянным значением - строка в кавычках, дата-время в кавычках или числовой литерал.
Нельзя использовать заполнитель параметров для чего-либо еще в SQL, например имен столбцов, имен таблиц, списков значений, ключевых слов или выражений SQL или другого синтаксиса.
Если вам нужно сделать имена столбцов динамическими, единственный вариант - проверить их по списку известных столбцов.
$columns_in_user_table = [
'userid'=>null,
'username'=>'',
'firstname'=>'',
'lastname'=>''
];
// Extract values from POST, but only those that match known columns
$parameters = array_intersect_key($_POST, $columns_in_user_table);
// Make sure no columns are missing; assign default values as needed
$parameters = array_merge($columns_in_user_table, $parameters);
Если вы используете PDO вместо mysqli, вы можете пропустить привязку. Просто используйте именованные параметры и передайте свой ассоциативный массив пар столбец-значение непосредственно в execute()
:
$columns = [];
$placeholders = [];
foreach ($parameters as $col => $value) {
$columns[] = "`$col`";
$placeholders[] = ":$col";
}
$column_list = implode($columns, ',');
$placeholder_list = implode($placeholders, ',');
// Write into the database
$sql = "INSERT INTO `user` ($column_list) VALUES ($placeholder_list)";
$stmt = $pdo->prepare($sql);
$stmt->execute($parameters);