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

         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>

-А для такого новичка, как я, есть код попроще? :)

-1
user225269 19 Янв 2010 в 15:43
1
Вы должны объяснить, что не так с нашим текущим кодом (кроме отступов) и как это связано с phpmyadmin.
 – 
Álvaro González
19 Янв 2010 в 15:45
Я думаю, он неправильно прочитал phpadmin, так как это сценарий входа в систему, и он не знал об этом инструменте.
 – 
Cryophallion
19 Янв 2010 в 16:30

3 ответа

Лучший ответ

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

1
Vince Bowdren 19 Янв 2010 в 15:57

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

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

2
Cryophallion 19 Янв 2010 в 16:03

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.

1
symcbean 19 Янв 2010 в 16:29