пытаясь получить форму входа в php - PullRequest
0 голосов
/ 19 января 2010

Вот код, над которым я работаю:

         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 ]

2 голосов
/ 19 января 2010

Если вы делаете это как учебное упражнение, нет более простого способа сделать это, и убедитесь, что оно работает (хотя вы можете сделать все это как одну страницу, так что если у вас есть ошибка, вы можете попробовать снова ).

Реально, это слишком просто. Вы должны хешировать пароли, использовать соль, применять надежные пароли, иметь максимальное количество попыток входа в систему и хранить любую информацию пользователя в сеансе. Но все это может прийти позже ....

1 голос
/ 19 января 2010

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) цикл while завершается неудачно на следующей итерации 6) для цикла итерации 2 7) цикл while завершается неудачно на следующей итерации 8) для цикла итерации 3 9) цикл while завершается неудачно на следующей итерации

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 ('Login Successful!')"; } иначе если ($ пароль! = $ pass || $ username! = $ user) { echo («Пожалуйста, введите правильное имя пользователя и пароль ...»); ?>

Это не будет анализироваться - есть непревзойденный '{' после остального

8) Условие в операторе else является избыточным - код будет всегда входить в предложение else только в случае сбоя в предложении if, и по определению

($ username == $ user && $ password == $ pass) ===! ($ пароль! = $ pass || $ username! = $ user)

9) использование mysql_select_db () может значительно усложнить жизнь, если вы работаете с несколькими базами данных mysql - в общем, лучше указать, в какой базе данных находится таблица, с помощью оператора DML.

C.

1 голос
/ 19 января 2010

Ваш код не слишком сложен - его совсем нельзя упростить, если он выполняет свою работу. Но вы не должны хранить пароли в своей базе данных в незашифрованном виде. Взгляните на эту статью о хэшировании паролей в mysql .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...