Для начала, ваш код будет выполнять бесконечный и прерывистый цикл, если произойдет ошибка входа в систему.Вам нужен файл изнутри, который не будет работать.Я впечатлен тем, что вы потратили время на то, чтобы правильно понять некоторые основы безопасности и внедрили PDO в ваши вызовы БД и должным образом экранировать свой пользовательский ввод с помощью подготовительных операторов.
edit
Я предполагаю, что ваш логинстраница действительно существует на index.php.В отличие от «повторяющихся» операторов из вашего сценария login.php, я бы разрешил обрабатывать весь сценарий, фиксируя любые ошибки в известной переменной $ _SESSION, например:
$ _ SESSION ['login_valid_error'] = "некоторый текст".
В конце скрипта,
if(isset($_SESSION['login_valid_error']) && !empty($_SESSION['login_valid_error'])) {
header(...) //take the person to logged in page
} else {
header('Location: index.php');
}
, затем обратно на index.php, чуть выше вашей формы создайте раздел уведомления об ошибке (снекоторый css), который, если страница загружена и переменная существует, выведите его:
<?php
if(isset($_SESSION['login_valid_error'])) {
echo '<div class="error">'. $_SESSION['login_valid_error'] .'</div>';
unset($_SESSION['login_valid_error']);
}
?>
, убедившись, что сбросил переменную после загрузки страницы (любые новые попытки на странице будут собирать новые ошибки.
Я бы также подумал о том, чтобы использовать что-то вроде phpass ссылка здесь . Поначалу это может показаться немного сложным, но скачайте код и посмотрите примеры. На самом деле его очень легко интегрировать, и это позволитчтобы не беспокоиться о добавлении / хешировании ввода пользователя для таких вещей, как пароли.