Для значений данных вам непременно следует использовать подготовленные операторы и параметры запроса.Например, ваши значения $pick1
и $player
попадают в эту категорию.Чтобы узнать о готовых утверждениях, это отличное место для начала .
Однако , это не совсем то, о чем вы спрашиваете.Вы спрашиваете об использовании переменных для объектов схемы (имена столбцов, таблиц и т. Д.) Вместо значений данных.Эти не могут быть обработаны параметрами запроса.
Хорошая новость заключается в том, что вы можете использовать переменную, чтобы делать именно то, что вы пытаетесь сделать.Например:
$query = "UPDATE Table1 SET Col_{$someVar}_X = ?";
Это просто интерполирует значение в строку, как любая другая строка в PHP.Но тогда, учитывая озабоченность по поводу SQL-инъекции , реальным вопросом становится:
Откуда $someVar
откуда?
Этоникогда не должен исходить из пользовательского ввода. К счастью, хотя значения данных могут быть любыми под солнцем, объекты схемы конечны и известны заранее.Таким образом, вы можете использовать простой подход белого списка.Когда логика обрабатывается, вы можете получить список всех возможных допустимых значений для $someVar
.(Либо жестко запрограммировано, либо сгенерировано из схемы базы данных.)
Затем вы можете сравнить любое входное значение со значениями в этом списке.Если совпадений нет, верните ошибку.Если является соответствием, используйте соответствующее значение из списка.Таким образом, вы всегда будете использовать только известные безопасные значения, которые ничем не отличаются от буквальной строки.
В конце концов, в то время как на первый взгляд это может вызвать некоторые тревоги SQL-инъекции:
$query = "UPDATE Table1 SET Col_{$someVar}_X = ?";
Контекст этих аварийных сигналов немного отличается, если вы знаете, откуда исходит значение:
$someVar = "123";
$query = "UPDATE Table1 SET Col_{$someVar}_X = ?";
Внедрение SQL не всегда связано с использованием подготовленных операторов в качестве волшебной палочки.Речь идет о постоянном контроле кода SQL, выполняемого вашим приложением, откуда бы этот код ни исходил.Пока вы контролируете код, а пользователь - нет, все в порядке.