2011-07-29 29 views
2

我在数据库中有两个用户,当我尝试登录时,它只停留在索引页上。如果一个用户在数据库中,您可以很好地登录,但只有两个用户才会重定向到索引页面。这是什么问题。PHP登录脚本不能正常工作

<?php 

include("connect.php"); 

$username = $_POST["username"]; 
$password = $_POST["password"]; 

$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($password); 

echo $username; 
echo $password; 

if (empty($_POST['username']) || empty($_POST['password'])) 
{ 
    //$_SESSION["login_error"] = "1"; 
    echo 'error code 1'; 
    header ('Location: ../index.php'); 
} 

//$password = sha1($password); 

$sql = "SELECT * FROM users"; 
$result = mysql_query($sql); 
if (!$result) die('Invalid query: ' . mysql_error()); 

$userid = ""; 

while ($row3 = mysql_fetch_array($result, MYSQL_ASSOC)) 
{ 

    if(($username == $row3["username"]) && ($password == $row3["password"])) 
    { 
      $userid = $row3["id"]; 
      $_SESSION["userid"] = $userid; 

      //$online = mysql_query("UPDATE numbers SET online='1' WHERE id='".$userid."'") 
      //or die(mysql_error()); 

      //$type = mysql_query("UPDATE numbers SET type='facetime' WHERE id='".$userid."'") 
      //or die(mysql_error()); 
      echo $userid; 
      echo 'error code 2'; 
      header ('Location: ../control_panel.php'); 
    } 
     else 
     { 
      $userid = ""; 
      $_SESSION["userid"] = ""; 
      header ('Location: ../index.php'); 
      echo 'error code 3'; 
     } 

     //debug 
     //echo $password; 
     //$useridvar = $_SESSION["userid"]; 
     //echo $useridvar; 
} 
     if ($_SESSION["userid"]=="") 
    { 
     header ('Location: ../index.php'); 
     echo 'error code 4'; 
    } 



    //else 
    //{ 
    // $userid = ""; 
    // $_SESSION["userid"]= ""; 
    // header ('Location: ../login.php'); 
    //} 

?> 

回答

4

您的代码非常糟糕。你在循环整个用户表?那是糟糕的。试试这个:

<?php 

include("connect.php"); 

$username = $_POST["username"]; 
$password = $_POST["password"]; 

$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($password); 

if (empty($_POST['username']) || empty($_POST['password'])) 
{ 
    header ('Location: ../index.php?emptyusernameorpassword'); 
    die(); 
} 

$result = mysql_query("SELECT * FROM users where username = '".$username."' and password = '".$password."' LIMIT 1") or die('Invalid query: ' . mysql_error()); 
$row3 = mysql_fetch_assoc($result); 

if(mysql_num_rows($result) != 0) 
{ 
    $_SESSION["userid"] = $row3["id"]; 

    header ('Location: ../control_panel.php'); 
    die(); 
} 
else 
{ 
    $_SESSION["userid"] = ""; 
    header ('Location: ../index.php?invaliduserorpassword'); 
    die(); 
} 

?> 
+0

任何关于如何使它更好的建议然后 – mintuz

+0

编辑我的帖子,试试上面的代码。 – technology

+0

嘿哇感谢:D – mintuz

1

在发出'header'命令之前,您不能有输出。

此外,您还需要在标题命令后直接发出'exit'。

2

您对header()函数调用通过调用echo()之前。据我所知,如果您的脚本之前生成输出,添加HTTP标头将不起作用。另外,我认为Location HTTP标头需要一个以http:///开头的绝对路径。然后,您应该在呼叫header()之后立即添加exit()来电,以防止稍后添加任何其他标头信息。

+0

我摆脱了他们,但仍然无法正常工作。 – mintuz

+0

请尝试为您的位置标题使用绝对路径,并告诉我们是否有帮助。 –

-1

你检查了你的错误日志吗?

你正在回显文本,然后发送标题,这将无法正常工作。

请确保在您的php.ini中设置了display_errors 1 并且在文件的顶部error_reporting(-1);

0

我看不到你在哪里调用session_start();如果你想在任何脚本中使用$ _session ['var'],这应该是你的代码中的第一行,你应该首先使用session_start()开始会话,然后每个header()调用之后都应该跟'exit'。没有''即退出;否则脚本将继续执行并且不会加载标题中指定的链接。

3

那么,其他答案已经指向你的主要错误:“发送标题之前不要输出任何东西”。 Develroot还表示,你不应该遍历用户表的所有记录。

如果你还有兴趣的原因为什么你会被重定向到指数两个用户,那么这就是答案:

在你的循环,你的计划,你会遍历所有记录用户表,如果你找到了正确的,你将重定向到正确的位置,如果你找到了错误的,你重定向到索引。

因此,根据的记录,在表中的顺序,你的代码通常这样处理:

  • 记录1:良好的用户?是。然后将“位置”设置为“面板”
  • 记录2:好用户?不可以。覆盖“位置”,设置为“索引”。

如果你找到好用户后会打断你的循环,你的代码将会起作用。 (效率不高,但会起作用)。

当然,您真的应该按照Develroot的建议设计这个程序。

+0

+1为幽默解释:) – Torxed