Другие языки программирования и технологии

Помогите с авторизацией на PHP

Вообщем написал такой просто код авторизации на сайте

session_start();

if(isset($_POST['login'])){ $login = $_POST['login']; if($login == ''){ unset($login); }}

if(isset($_POST['password'])){ $password = $_POST['password']; if($password == ''){ unset($password); }}

if(empty($login) or empty($password)){

exit("Вы что то не ввели");

}

$login = htmlspecialchars($login);

$login = stripslashes($login);

$password = htmlspecialchars($password);

$password = stripslashes($password);

include("db.php");

$result = mysql_query("SELECT * FROM `users` WHERE `login`='$login'", $db);

$myrow = mysql_fetch_array($result);

if(empty($myrow['password']))

{

exit("Неверный логин или пароль");

}

else {

if($myrow['password'] == $password){

$_SESSION['password'] = $myrow['password'];

$_SESSION['id'] = $myrow['id'];

echo "вы успешно вошли";

} else{

echo "ошибка";

}

}

пользователь удачно входит по своему логину и паролю, но стоит только закрыть, обновить или перейти на другую страницу ему снова нужно проходить заново авторизацию, что нужно добавить что бы авторизация сохранялась?
.. ..
.. ..
327
юзай куки или сессии
Элцин Axadzade
Элцин Axadzade
36 123
Лучший ответ
Я заманался твой код форматировать! Ты сам-то можешь разобрать логику программы, когда код идёт сплошняком вроде if(isset($_POST['login'])){ $login = $_POST['login']; if($login == ''){ unset($login); }}? Ты что, на PHP с перла перешёл?
И запомни, здесь все отступы убираются, размещай код на pastebin.
Итак.
Во-первых, переменные $password и $login у тебя не определены, если у тебя не пришли данные через $_POST. То, что ты запустил сессию, не значит, что из неё не нужно брать данные.
Вот это
if (isset($_POST['password']))
{
$password = $_POST['password'];
if ($password == '')
unset($password);
}
замени на
if (isset($_POST['password']) && !empty($_POST['password']))
$password = $_POST['password'];
Зачем писать лишний код?

$login = stripslashes(htmlspecialchars($login));
Так тоже короче. И ещё тут будет ошибка если через $_POST ничего не пришло, ты забыл это учесть

$password = htmlspecialchars($password);
$password = stripslashes($password);
Вот это ты нафига делаешь? Зачем ты пароль в базе в открытом виде хранишь и почему вырезаешь из него часть символов? Может быть, вообще оставим в пароле только буквы a и b, и чтобы они встречались не чаще одного раза? Ты понимаеншь, что ты уменьшаешь криптостойкость пароля? Ты делаешь htmlspecialchars, ты собрался пароль в браузер отдавать что ли? Для твоих целей есть mysql_real_escape_string. Кстати, сейчас вроде mysql_* устарели, нужно пользоваться mysqli_*
Делай так:
if (isset($password)) $password = hash('sha512', $password);
else $password = '';
затем не нужно выдёргивать данные из базы и сравнивать нужное поле с паролем, делай сразу
SELECT * FROM `users` WHERE `login`='$login' AND `password` = '$password'
Ну ты как первый раз sql увидел.

И в самом начале можешь сделать if (!isset($_SESSION['id']) && isset($_POST['login'], $_POST['password'])), чтобы вся эта фигня работала только для незалогиненных пользователей, которые прислали данные на авторизацию. И везде, где надо, проверяй $_SESSION['id']

exit("Вы что то не ввели");
-то, -либо, -нибудь. Пользователи не любят, когда разработчик сайта глупее их самих.

Если у тебя это реальный файл авторизации, нужно всё поменять. Заверни всё это дело хотя бы, например, в функцию и делай не exit и echo (кстати, почему ты их чередуешь? ) , а return или даже throw new exception
Арман Гайсин
Арман Гайсин
60 964
Кароче, удали код и перепиши заново с позиции ооп, быстрее будет и глюков меньше