Вот код, над которым я работаю:
login.php:
<?php
$con = mysql_connect("localhost","root","");
mysql_select_db("koro",$con);
$result= "SELECT * FROM users WHERE
UNAME='".mysql_real_escape_string($_POST['Uneym'])."'";
echo $result;
$num=mysql_num_rows($result);
echo $num;
for($i=1;$i<=$num; $i++){
while($row=mysql_fetch_array($result))
{
$user=$row['UNAME'];
$pass=$row['PW'];
}
}
if($username == $user && $password ==$pass)
{
echo "<script>alert('Login Successful!')</script>";
}
else if($password!= $pass ||$username != $user )
{
echo("Please Enter Correct Username and Password ...");
?>
Loginform.php:
<html>
<form action="login.php" method="post">
Username:<input type="text" name="Uneym" value="" /><br/>
Password:<input type="password" name="Pass" value="" /><br/>
<br/>
<input type="submit" name="Submit" value="" />
</form>
</head>
<body>
</body>
</html>
-А для такого новичка, как я, есть код попроще? :)
3 ответа
Ваш код не слишком сложен - его невозможно сделать намного проще, если он должен выполнять свою работу. Но вы не должны хранить пароли в своей базе данных в таком незашифрованном виде. Ознакомьтесь с этой статьей о хешировании паролей в mysql .
Если вы делаете это в качестве обучающего упражнения, нет более простого способа сделать это и убедиться, что он работает (хотя вы можете сделать все это на одной странице, чтобы в случае ошибки вы могли попробовать еще раз).
На самом деле это слишком просто. Вы должны хешировать пароли, использовать соль, применять хорошие пароли, иметь максимальное количество попыток входа в систему и хранить любую информацию о пользователе в сеансе. Но все это может произойти позже ....
1) Первая ошибка заключается в том, что вы никогда не отправляете запрос в СУБД - ваш код должен выглядеть примерно так:
$dbh=mysql_connect(...);
mysql_select_db(...,$dbh); // note see below
$result=mysql_query(....$dbh);
while ($row=mysql_fetch_assoc($result)) {
...
}
2) У вас есть 2 цикла (цикл for и цикл while) вокруг кода, который извлекает строки из запроса - должен быть только один. Итак, если ваш запрос возвращает 3 строки, вы фактически выполняете цикл 9 раз:
1) для итерации цикла 1 2) в то время как итерация цикла 1 выбирает строку 1, записывает результаты 3) в то время как итерация цикла 2 извлекает строку 2, записывает результаты 4) в то время как итерация цикла 3 выбирает строку 3, записывает результаты 5) пока цикл не выполняется на следующей итерации 6) для итерации цикла 2 7) при сбое цикла на следующей итерации 8) для итерации 3 цикла 9) при сбое цикла на последующей итерации
3) Вы назначаете значения, возвращаемые mysql_fetch_assoc, скалярным переменным (т.е. вы перезаписываете результат каждый раз, поэтому $ user и $ pass всегда содержат значения из последней возвращенной строки.
4) Хорошая практика заключается в установлении критериев раннего выхода в цикле - помимо предотвращения избыточного выполнения, это также решит третью ошибку, описанную выше, например
$valid=false;
while($row=mysql_fetch_array($result))
{
if (($username==$row['UNAME']) && ($password==$row['PW'])) {
$valid=true;
break;
}
}
if ($valid) {....
4) Следующая проблема заключается в том, почему вы проверяете, совпадает ли имя пользователя с $ username, если ранее вы сказали, что оно должно быть таким же, как $ _POST ['Uneym'].
5) Следующая проблема заключается в том, что вы, кажется, написали этот код с включенным register_globals.
6) Следующая проблема заключается в том, что вы без необходимости извлекаете данные из базы данных - просто добавьте фильтр к паролю, тогда вы получите только 1 или ноль строк (и вам даже не нужно перебирать набор результатов):
$user=mysql_real_escape_string($_POST['Uneym'], $dbh);
$pass=mysql_real_escape_string($_POST['password'], $dbh);
$result=mysql_query("SELECT * FROM users WHERE UNAME='$user' AND PW='$pass'",$dbh);
$valid=mysql_num_rows($result);
И еще есть еще:
7) if ($ username == $ user && $ password == $ pass) {echo "alert ('Успешный вход!')"; } else if ($ password! = $ pass || $ username! = $ user) {echo ("Пожалуйста, введите правильное имя пользователя и пароль ..."); ?>
Это не будет анализироваться - после else стоит непревзойденный '{'
8) Условие в операторе else является избыточным - код всегда переходит в предложение else только в том случае, если он не выполняет предложение if, и по определению,
($ username == $ user && $ password == $ pass) ===! ($ пароль! = $ пароль || $ имя пользователя! = $ пользователь)
9) использование mysql_select_db () может очень усложнить жизнь, если вы работаете с несколькими базами данных mysql - в общем, лучше явно указать, в какой базе данных находится таблица, с помощью оператора DML.
C.
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.