Php没有用标题发送

时间:2014-03-03 19:19:22

标签: php

您好,我的部分代码出现问题。即使我的老师也帮不了我,我不知道还能去哪儿。当我的foreach循环被激活并且密码和用户名与硬编码字符串相同时,它仍然会重定向到loginerror.php。当我删除标题(“Location:loginerror.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 个答案:

答案 0 :(得分:0)

exit所以重定向后没有执行其他代码:

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

答案 1 :(得分:0)

根据PHP文档:

  

请记住,在发送任何实际输出之前,必须通过普通HTML标记,文件中的空行或PHP来调用 header()。使用include或require,函数或其他文件访问函数读取代码是一个非常常见的错误,并且在调用 header()之前输出空格或空行。

参考: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输出。

答案 2 :(得分: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>

答案 3 :(得分:0)

像之前提到过的那样。您在发送标头之前已经输出了。 您需要将其包装在条件中或使用第二个脚本检查密码。

您可以将代码包装在if / else $ _POST中,并在条件满足后在foreach中中断操作。