Потому что трудно / неэффективно проверить каждую переменную перед ее использованием. Вместо этого они проверяют только входные переменные - проверяют посетителей у двери, а не один раз в доме.
Конечно, это хороший метод защитного программирования, чтобы проверить по крайней мере более важные переменные перед их использованием, особенно если ввод поступает из многих мест.
Это немного не по теме, но я бы порекомендовал решение проверить входные переменные следующим образом:
$username=get('username', 'string');
$a=get('a', 'int');
...
$ _ ЗАПРОС и тому подобное никогда не должны использоваться (или даже быть доступны) напрямую.
Кроме того, при выводе HTML вы всегда должны использовать это:
echo html($username); // replaces '<' with '<' - uses htmlentities
Чтобы избежать атак с использованием SQL-инъекций, можно использовать MeekroDB, но, к сожалению, это очень ограничивает (только MySQL, только одна БД, ...). У него хороший API, который способствует безопасности, поэтому я бы порекомендовал проверить его.
Для себя я создал небольшую библиотеку БД, основанную на PDO и использующую подготовленные операторы. YMMV.