Плейсхолдеры передают данные отдельно от SQL, поэтому ввод не становится кодом запроса.
Разбор
- Не конкатенируйте пользовательский ввод в SQL.
- Имена таблиц/колонок плейсхолдерами не защитить — белые списки.
- Экранирование вручную ошибочно.
- ORM тоже должны использовать параметризацию.
Пример
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$id]);
Итог
Параметры отдельно от SQL — главный анти-injection приём.