Добрый день, подскажите почему постоянно заходит через первую запись базы где логин admin, причем логины и пароли ввожу разные. Внизу кусок кода: Код (Text): <?php session_set_cookie_params(10800); session_start(); include ('connect.php'); if(isset($_POST['go'])) { $q2=mysql_query("SELECT * FROM database WHERE login='".$_REQUEST['login']."' and tariff_id='2'"); $f = mysql_fetch_array($q2); if(($_REQUEST['login']==$f['login']) && (md5($_REQUEST['passwd'])==$f['password'])) { $_SESSION['enter'] = "1"; $_SESSION['us_id'] = $f['user_id']; $_SESSION['right'] = $f['rig']; header("Location: index.php"); } else { echo "<div class='clean-gray'>Не верное сочетание логина и пароля <a href=lock.php>Попробовать ещё раз.</a></div>"; } } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <head> <title>Вход Админцентр</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <link rel="shortcut icon" href="images/siteico0.ico" type="image/x-icon" /> <style type="text/css" media="all"> * { margin: 0; padding: 0; } body {background: #fAfAfA; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px;} img {border:none;} #conteiner {width: 400px; margin: 7em auto;} #conteiner .loform { padding: 16px 16px 16px 16px; font-weight: normal; -moz-border-radius: 11px; -khtml-border-radius: 11px; -webkit-border-radius: 11px; border-radius: 5px; background: #fff; border: 1px solid #e5e5e5; -moz-box-shadow: rgba(200,200,200,1) 0 4px 18px; -webkit-box-shadow: rgba(200,200,200,1) 0 4px 18px; -khtml-box-shadow: rgba(200,200,200,1) 0 4px 18px; box-shadow: rgba(200,200,200,1) 0 4px 18px; } #conteiner .mess { margin-bottom: 10px; padding: 10px; font-weight: normal; -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; border: 1px solid; -moz-box-shadow: rgba(200,200,200,1) 0 4px 18px; -webkit-box-shadow: rgba(200,200,200,1) 0 4px 18px; -khtml-box-shadow: rgba(200,200,200,1) 0 4px 18px; box-shadow: rgba(200,200,200,1) 0 4px 18px; color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; } #conteiner .loform p {color:#808080; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:14px; margin:5px;} #conteiner .loform input {background:#fafafa; border:1px solid #cccccc; color:#666666; padding:4px; width:98%; font-size:25px; margin-bottom:20px;} #conteiner .loform input.submit {margin-top:-16px; width:74px; height:64px; border: 1 px; text-align:right; vertical-align:top;} #conteiner .loform a {color: #bcbcbc; text-decoration: none;} #conteiner .loform a:hover {color:#d7722f;} #conteiner .logo {text-align:center; padding-bottom:20px;} </style> </head> <body> <div id="conteiner"> <div class="logo"> <p><strong>Вход для администраторов</strong></p> </div> <div class="loform"> <form name="form1" method="post" action="">` <p>Логин <input type="text" name="login" size="40" /></p> <p> Пароль<br /> <input type="password" name="passwd" size="40" /> <input type="submit" value="Войти" size="40" name="go"> </p> </form> </div> </div> </body> </html> <? ?>
тут столько ошибок, что я просто теряюсь сказать почему. это каша-малаша. во первых, ты не проверяешь параметры login и passwd на пустоту. а потом не проверяешь результат запроса (а вдруг не нашел ничего?) во вторых, судя по первому if ты ждешь данных из post-запроса, а потом вдруг согласен получить login и passwd из все равно откуда ты понимаешь что такое $_REQUEST? в третьих, ты подставляешь в запрос неэкранированные данные. это приглашение к сексу в слепую. в четвертых, сразу после header('Location...') должен стоять exit(), ВСЕГДА! ... и почему в случае НЕудачи сессия никак не меняется? это же сессия, один раз туда попало нечто и блеать лежит там при следующем вызове и в третьем, двадцать пятом.. ... короче хз. просто незачет
Поменял на следуещее, но не входит Код (Text): include './connect.php'; if(isset($_POST['login'], $_POST['passwd'])) { $login = is_scalar($_POST['login']) ? mysql_real_escape_string(trim($_POST['login'])) : NULL; $pass = is_scalar($_POST['passwd']) ? md5($_POST['passwd']) : NULL; if(!empty($login) && !empty($pass)) { $qw="SELECT `rig`,`user_id` FROM `re_user` WHERE `login` = '$login' AND `password` = '$pass'"; $q2=mysql_query($qw); $f = mysql_fetch_assoc($q2); if(!empty($f['user_id'])) { $_SESSION['enter'] = 1; $_SESSION['us_id'] = $f['user_id']; $_SESSION['right'] = $f['rig']; $_SESSION['login'] = $login; } else { echo '<div class="clean-gray">Не верное сочетание логина и пароля <a href="lock.php">Попробовать ещё раз.</a></div>'; } } else { echo '<div class="clean-gray">Введите логин и пароль <a href="lock.php">Попробовать ещё раз.</a></div>'; } }
выглядит лучше бизнес-логика правда не улучшилась, зато техника подросла. что ты имеешь: если форма отправлена и данные верны, то в сессию записывается инфа о пользователе. что такое авторизация: проверка имеет ли право текущий пользователь на некое действие. например на просмотр какой-то страницы. у тебя здесь нет авторизации, строго говоря. см. вики. я лично не понимаю что ты называешь "не входит". я не вижу проверки статуса пользователя. он вродебы устанавливается, но не используется. Алсо: если ты тестируя свое изделие один раз успешно прошел аутентификацию, то эти данные будут жить в сессии довольно долго. неуспешные попытки ничего не меняют. нигде нет ни настоящего logout, ни сброса сессии при неуспехе. видимо это причина твоей боли.
В код личного кабинета добавил кнопку выхода Код (Text): <form action="" method="post"><input type='submit' name='exit' value='Выйти из кабинета'/></form> <?php if($_REQUEST['exit']) { header("Location: lock.php"); session_destroy(); exit(); } ?>
Здесь форма лишняя. чтобы породить параметр с именем "exit", достаточно дать ссылку Код (Text): <a href="?exit">Выйти из кабинета</a> ... if (isset($_GET['exit'])) ... Ты избежишь многих проблем если избавишся от $_REQUEST и будешь явно использовать $_GET и $_POST. Еще мега-совет: отлаживай свои скрипты с выводом всех ошибок и предупреждений. А когда перенесешь на рабочий сервер, выключай это. Код (Text): error_reporting(-1); ini_set('display_errors', 'on'); Поначалу это повергнет тебя в депрессию, столько появится предупреждений о неизвестных переменных и индексов массива. Например такая хуйня порождает предупреждение: Код (Text): if($_REQUEST['exit']) Потому что в большинстве случаев у этого массива отсутствует индекс 'exit'. Придется везде втыкать isset() или array_key_exists() или !empty()... Но это реально помогает избавиться от скрытых ошибок. Предупреждения они не зря!