试图在PHP中有一个登录表单

时间:2010-01-19 12:43:02

标签: php mysql phpmyadmin

以下是我正在处理的代码:

         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 个答案:

答案 0 :(得分:2)

如果你是作为一个教学练习,没有没有更容易的方法,并确保它的工作(虽然你可以作为一个页面,所以如果它有一个错误,你可以再试一次)。

实际上,它太简单了。您应该散列密码,使用salt,强制执行正确的密码,最大登录尝试次数,并在会话中存储任何用户信息。但所有这些都可以在以后发生......

答案 1 :(得分:1)

您的代码并不太复杂 - 如果要完成这项工作,它就不会变得简单得多。 但是,您不应该像这样在未加密的数据库中存储密码。请查看hashing passwords in mysql上的这篇文章。

答案 2 :(得分:1)

1)第一个错误是您永远不会将查询提交给DBMS - 您的代码应该类似于:

$dbh=mysql_connect(...);
mysql_select_db(...,$dbh); // note see below
$result=mysql_query(....$dbh);
while ($row=mysql_fetch_assoc($result)) {
  ...
}

2)你有两个循环(一个for循环和一个while循环)围绕代码从查询中检索行 - 应该只有一个。因此,如果您的查询返回3行,您实际上循环了9次:

1)for循环迭代1 2)while循环迭代1获取第1行,写入结果 3)while循环迭代2取第2行,写入结果 4)while循环迭代3取第3行,写入结果 5)while循环在后续迭代中失败 6)用于循环迭代2 7)while循环在后续迭代中失败 8)用于循环迭代3 9)while循环在后续迭代中失败

3)将mysql_fetch_assoc返回的值分配给标量变量(即每次都覆盖结果 - 所以$ user和$ pass总是包含返回的最后一行的值。

4)在循环中建立早期退出标准的良好做法 - 除了避免冗余执行之外,这也将解决上述第3个错误,例如

$valid=false;
while($row=mysql_fetch_array($result))
{
       if (($username==$row['UNAME']) && ($password==$row['PW'])) {
           $valid=true;
           break;
       }
}
if ($valid) {....

4)接下来的问题是为什么在你之前说过它应该和$ _POST ['Uneym']相同时检查用户名是否与$ username匹配。

5)下一个问题是你似乎已经用register_globals编写了这段代码。

6)下一个问题是您不必要地从数据库中获取数据 - 只需在密码上添加一个过滤器,然后您将只获得1行或0行(并且您甚至不需要遍历结果集):

 $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&amp;&amp; $ password == $ pass)        {             echo“alert('登录成功!')”;            }             否则if($ password!= $ pass || $ username!= $ user)              {             echo(“请输入正确的用户名和密码......”);            ?&GT;

这不会解析 - 在else

之后有一个无法比拟的'{'

8)else语句中的条件是多余的 - 如果if子句失败,代码只会进入else子句,并且根据定义,

($ username == $ user&amp;&amp; $ password == $ pass)===! ($ password!= $ pass || $ username!= $ user)

如果你正在使用多个mysql数据库,那么使用mysql_select_db()可能会使生活变得非常复杂 - 一般来说,更好的方法是使用DML语句夸大地说明一个表所在的数据库。

℃。