По нормальному надо сначала сделать запрос на наличие юзера в базе, потом уже доставать его, так же если хотите получить количество строк, то используйте https://www.php.net/manual/ru/mysqli-result.num-ro...
Так как юзер уникальный, то стоит добавить limit 1 в запрос. Так же при работе с бд нужно использовать подготовленные выражения
Проверка юзера
select count(*) as cnt from users where login = ? limit 1
Так же убрать exit и сделать else
Zefirot, это пример. Не важно где лежат ваши файлы, они могут быть где угодно, хоть в облаках. Есть скрипт. file.php?file=1.txt скрипт получает имя файла или его ид, дальше уже скрипт его достаёт, вещает заголовки и отдаёт в арбузер
Я вот тоже не понял, есть роутер. Например в конструктор принимает конфиг, конфиг описывает пути, аргументы и методы. Метод ран смотрит и сравнивает пути, вызывает методы если нашлись совпадения