2011-07-29 77 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