Как уже говорилось в комментариях, вы можете использовать параметр-заполнитель только для замены скалярного значения, то есть если бы вы в противном случае использовали строку в одинарных кавычках, дату / время в кавычках или числовой литерал.
Параметры не работают для идентификаторов, таких как имена таблиц или имен столбцов, ни ключевые слова SQL, ни выражения SQL, ни списки значений (вам придется использовать один заполнитель для каждого скалярного значения в списке).
В тех случаях, когда вы хотите, чтобы имя столбца или ключевые слова SQL были динамическими, как вы пытаетесь это сделать, вы будете уязвимы для внедрения SQL, если не убедитесь, что динамическая часть ограничена неопасными строками.
Например,Вы можете сделать это с разделением и с экранированием .
$columnname = str_replace("]", "]]", $columnname);
$sql = "ALTER TABLE myTable ADD [$columnname] $type";
MS SQL Server использует квадратные скобки для разделения идентификатора, который может содержать специальные символы.Str_replace () на всякий случай, если само имя столбца содержит квадратные скобки.Прочитайте https://sqlsunday.com/2014/09/21/identifiers-in-tsql/ для более подробного объяснения.
А как насчет $ type?Как мы можем убедиться, что это безопасно?Другая техника - , белый список .Чтобы сделать $ type безопасным, вам нужно проверить его по списку допустимых значений.
switch ($type) {
case "int":
// OK, nothing to change
break;
case "varchar":
$type = "varchar($length)"
break;
// ...add cases for other allowed types...
default:
die("Unrecognized type: $type");
}
Вы можете либо умереть с ошибкой в предложении default
, либо вы можете установить $type
вразумный дефолт.Зависит от того, как вы хотите с этим справиться.
Вы можете спросить, Зачем столько кода?Почему это не может быть проще?
Потому что вам требуется, чтобы программное обеспечение делало что-то динамичное.Вы пытаетесь заставить код делать правильные вещи независимо от того, что вводит пользователь.Если вам не нужно поддерживать пользовательский ввод, вы можете сделать имя и тип столбца фиксированными, и тогда все будет просто.