【问题标题】:Php not sending with headersPhp 不发送标头
【发布时间】:2014-03-03 19:19:22
【问题描述】:

您好,我的某些代码有问题。连我的老师都帮不了我,我不知道还能去哪里。当我的 foreach 循环被激活并且密码和用户名与硬编码字符串相同时,它仍然重定向到 loginerror.php。当我删除标题(“位置: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>

【问题讨论】:

  • "Even my teacher cant help me" - 我强烈建议找一个更好的老师。
  • 您的老师一无所知...您的 header() 调用将无法正常工作,因为您在到达 header() 代码之前已经输出了完整的 html 文档。
  • 那些不会教的人。
  • @MarcB 除了是否打开了输出缓冲,这可能是因为他被重定向了。
  • 感谢您解决了所有问题

标签: php


【解决方案1】:

根据 PHP 文档:

请记住,必须在发送任何实际输出之前调用 header(),无论是通过普通 HTML 标记、文件中的空白行还是从 PHP 发送。使用 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】:

    exit 所以重定向后不会执行其他代码:

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

    【讨论】:

    • 在您已经开始发送额外的输出后,您无法发送标头...
    • 真的吗?这就是它重定向到loginerror.php 的原因?没有说这是很棒的代码,我在回答为什么它继续重定向到loginerror.php。 php.ini 中很可能开启了输出缓冲。
    • 只需添加exit; 即可解决问题。 headers() 应该先输出...
    【解决方案3】:

    将您的代码结构更改为类似这样可能会对您有所帮助。

    注意:这不是代码更正。

    <?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>
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多