Всем привет. Решил сделать авторизацию на сайте следующим образом: На странице enter.php пользователь вводит логин и пароль, после нажатия кнопки переходит на страницу entercheck.php, на которой проверяется, все ли поля заполнены, есть ли такой пользователь в базе данных, если пользователь есть, то введенный пароль соответствует тому, что есть в базе. Если не все поля заполнены, то переменная $_SESSION['servicemessage']=1; Если пользователя нет в базе, то переменная $_SESSION['servicemessage']=2; Если пароль не совпадает, то переменная $_SESSION['servicemessage']=3; Если все хорошо, то переменная $_SESSION['servicemessage']=4. Далее осуществляется редирект на страницу servicepage.php, на которой происходит определенное действие, в зависимости от значения переменной $_SESSION['servicemessage']: $_SESSION['servicemessage']=1 - на странице пишется "не все поля заполнены"; $_SESSION['servicemessage']=2 - на странице пишется "такого пользователя нет"; $_SESSION['servicemessage']=3 - на странице пишется "неверный пароль"; $_SESSION['servicemessage']=4 - на странице пишется "вы успешно авторизованы". После переменная $_SESSION['servicemessage'] обнуляется и при входе на страница servicepage.php происходит редирект на главную страницу (т.е. просто так эту страницу пользователь не увидит). Все работает как надо, кроме "неверный пароль". Почему то в этом случае скрипт иногда работает, а иногда просто так редиректит на главную. Никакой закономерности не вижу. Может 3 раза сработать правильно, потом 1 неправильно, потом 1 правильно, 2 - неправильно и т.д. и т.п. Вот фрагмент файла entercheck.php: PHP: if (empty($email) or empty($password)) { $_SESSION['servicemessage']=1; header('Location: https://mydomain.ru/servicepage'); exit; } $email = stripslashes($email); $email = htmlspecialchars($email); $email = trim($email); $password = stripslashes($password); $password = htmlspecialchars($password); $password = trim($password); include('dbconnect.php'); $result = mysql_query("SELECT * FROM `users` WHERE `email`='$email'"); $myrow = mysql_fetch_array($result); if (empty($myrow['password'])) { $_SESSION['servicemessage']=2; header('Location: https://mydomain.ru/servicepage'); exit; } else { if ($myrow['password'] === $password) { $_SESSION['id']=$myrow['id']; $_SESSION['servicemessage']=4; header('Location: https://mydomain.ru/servicepage'); exit; } else { $_SESSION['servicemessage']=3; header('Location: https://mydomain.ru/servicepage'); exit; } }
ИМХО, лишние сложности. Статусы аутентификации можно показать на той же странице, что и форма входа. Ну или заменить форму входа фатальным сообщением. И сессию для этого не надо дёргать. Ну и сразу скажу что вот эти велосипеды с удалением слешей и обрезкой строк - нафиг не нужны, но и от атаки не защищают. Есть одна функция - mysqli_real_escape_string. Её к логину применить. А пароль - в открытом виде в базе не нужно держать. Хранить надо хэш. password_hash и password_verify уже изобрели.