Вопрос 1: выполняет ли $ mysqli-> query ("SET NAMES 'utf8'"); есть какая-либо помощь в инъекции sql?
Так сказано - определенно НЕТ.
Но посмотрите записку внизу.
Вопрос 2. Должен ли я использовать какую-то форму real_escape_string?
Вы из заблуждения спрашиваете, что побег имеет какое-то отношение к уколам, а это не так. Итак, давайте перефразируем ваш вопрос:
Вопрос 2а. Должен ли я принять некоторые меры предосторожности против инъекций SQL?
Да.
У вас есть три варианта.
- Поскольку $ userID является числом, вы можете явно привести его к этому типу,
$userID = intval($_POST['userID'];)
- Mysql (когда не в режиме STRICT) позволяет вам отправить число в виде строки. Строки должны быть отформатированы в соответствии с этими двумя простыми правилами, как показано в ответе Роба:
- он должен быть ограничен одинарными кавычками
- эти цитаты должны быть экранированы.
- Вы можете использовать подготовленные заявления. Чтобы использовать такой модный способ выполнения SQL-запросов, вы должны использовать
prepare()
+ execute()
методы вместо query()
и связать вашу переменную, используя bind_param()
.
Примечание относительно заглавного вопроса.
устанавливает ли пространство имен для utf-8 какую-либо форму защиты от SQL-инъекций?
Да, в некотором смысле.
В некоторых, крайне редких случаях, это так.
Для некоторых редких кодировок функция семейства real_escape_string
может не сработать из-за выхода правильного разделителя. Чтобы избежать этого, необходимо настроить кодировку клиента, используя семейную функцию set_charset
, в вашем случае mysqli->set_charset()
.