2014-03-03 48 views
0

你好,我有一些我的代碼有問題。即使我的老師也幫不了我,我也不知道還有什麼可去的地方。當我的foreach循環被激活並且密碼和用戶名與硬編碼字符串相同時,它仍然會重定向到loginerror.php。當我刪除標題(「Location:loginerror.php」)時,它的功能很好。爲什麼我的代碼的最後一行仍然被激活,當它應該加載一個新的頁面?Php不發送標題

<?php session_start(); ?> 
<html> 
<header></header> 
<body> 
<form action="login.php" Method="post"> 
Username: <input type="text" name="Username"> </br></br> 
Password: <input type="password" name="Password"> </br></br> 
<input type="submit" value="Login"></br></br> 
</form> 
<?php 


$username=$_POST["Username"]; 
$password=$_POST["Password"]; 
if($username == NULL){print("Enter a Username please");} 
else { 


    $users= array 
    (
"Bourne"=>"postcode", 
    "Unidan"=>"pincode", 
    "yoda"=>"sith" 
    ); 

    foreach($users as $user=>$password_value) 
    { 
    if(($user==$username)&&($password_value==$password)) 
    { 
    $_SESSION['login?']=1; 
    header("Location: calculation.php"); 
    }} 
    $_SESSION['login?']=0; 
    header("Location: loginerror.php"); 
    } 

    ?> 
    </body> 
    </html> 
+4

''連我的老師都不能幫助我'' - 我強烈建議找一個更好的老師。 – David

+1

你的老師是無能爲力的......你的header()調用將不起作用,因爲你在header()代碼到達之前已經輸出了完整的html文檔。 –

+0

那些不能教的。 –

回答

0

每PHP的文檔:

記住標題()必須任何實際輸出之前調用是通過普通的HTML標籤,文件中的空行或PHP發送的。使用include或require函數或其他文件訪問函數讀取代碼,並在調用標頭()之前輸出空格或空行是非常常見的錯誤。

參考:Header Documentation

移動你的PHP代碼的文件的頂部,它應該解決您的問題:

<?php 
    session_start(); 

    $username=$_POST["Username"]; 
    $password=$_POST["Password"]; 
    if ($username == NULL) { 
     print("Enter a Username please"); 
    } else { 
     $users= array("Bourne"=>"postcode", "Unidan"=>"pincode", "yoda"=>"sith"); 

     foreach($users as $user=>$password_value) { 
      if(($user==$username)&&($password_value==$password)) { 
       $_SESSION['login?']=1; 
       header("Location: calculation.php"); 
       // Add this to terminate the script immediately and redirect. 
       exit(); 
      } 
     } 
     $_SESSION['login?']=0; 
     header("Location: loginerror.php"); 
     // Add this to terminate the script immediately and redirect. 
     exit(); 
    } 
?> 
<html> 
<header></header> 
<body> 
    <form action="login.php" Method="post"> 
     Username: <input type="text" name="Username"> </br></br> 
     Password: <input type="password" name="Password"> </br></br> 
     <input type="submit" value="Login"></br></br> 
    </form> 
</body> 
</html> 

頁眉的必須在任何輸出之前發送,包括 HTML輸出。

+0

感謝它所有的工作:) – user3376192

0

exit所以沒有其他代碼重定向之後執行:

header("Location: calculation.php"); 
exit; 
+0

您已經開始發送額外的輸出後,您無法發送標題... – War10ck

+0

真的嗎?這就是爲什麼它重定向到'loginerror.php'?沒有說這是偉大的代碼,我正在回答爲什麼它繼續重定向到'loginerror.php'。 'php.ini'中最有可能的輸出緩衝。 – AbraCadaver

+0

只要加入'exit;'即可解決問題。 'header()'應該先輸出... – War10ck

0

將您的代碼結構更改爲這樣的內容可能會對您有所幫助。

注意:這不是代碼更正。

<?php 
session_start(); 

$username=$_POST["Username"]; 
$password=$_POST["Password"]; 
if($username == NULL){ 
    print("Enter a Username please"); 
} 
else { 
     $users= array 
     (
     "Bourne"=>"postcode", 
     "Unidan"=>"pincode", 
     "yoda"=>"sith" 
     ); 

     foreach($users as $user=>$password_value) 
     { 
      if(($user==$username)&&($password_value==$password)) 
      { 
       $_SESSION['login?']=1; 
       header("Location: calculation.php"); 
       exit; 
      } 
     } 
     $_SESSION['login?']=0; 
     header("Location: loginerror.php"); 
     exit; 
} 
?> 
<html> 
<header></header> 
<body> 
<form action="login.php" Method="post"> 
Username: <input type="text" name="Username"> </br></br> 
Password: <input type="password" name="Password"> </br></br> 
<input type="submit" value="Login"></br></br> 
</form> 
</body> 
</html> 
0

就像之前提到的一樣。發送標題之前您已經輸出。 您需要將其包裝在條件中或者有第二個腳本檢查密碼。

您可以將代碼封裝在if/else $ _POST以及滿足條件後的foreach中的break操作中。