mysqli::query
Возвращает false в случае неудачи. В случае успешного выполнения запросов SELECT, SHOW, DESCRIBE или EXPLAIN mysqli_query() вернёт объект mysqli_result.
Соответственно, возвращается объект mysqli_result (результат из нуля строк - это тоже корректный результат и вернётся объект), в строке
if ($row)
приводится к true, условие выполняется, клиенту возвращается "true".
А вообще логика крайне странная. Сначала вы пытаетесь найти логин в базе данных, а затем проверяете его регуляркой. Логично наоборот, хотя бы с точки зрения времени выполнения.
Ну и приучите себя использовать подготовленные выражения с плейсхолдерами, это лучшая защита от SQL-инъекций.