【问题标题】:Warning: Cannot modify header information - headers already sent (PHP) [duplicate]警告:无法修改标头信息 - 标头已发送(PHP)[重复]
【发布时间】:2011-05-09 14:14:42
【问题描述】:

我的问题有点类似于下面的帖子..

PHP error: Cannot modify header information – headers already sent

但在我的情况下,一旦我确定登录表单中没有验证错误并且用户的登录信息与数据库的登录信息匹配,我选择启动会话。下面是代码:

登录页面(在任何 html 之前)

session_name('username');
session_name('ip');
session_name('start');
session_start();    

Login.php sn-p(在html正文中)

         } else {
            $user = $_POST['username']; 
            $userpass = md5($_POST['password']); 
            $login_results = statement("select username, password from `$admin` where username='$user' and password='$userpass'");

            if (mysql_num_rows($login_results)!= 1) { 
                $errmsg = "<span id='error'>Login failed: Username or password not on file</span>";
            }else {

                $_SESSION['username'] = "$user"; 
                $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
                header("Location: index.php"); 
            }
        }
    }

}

如果您查看上面代码的 else 块,我正在验证登录,如果它很好,我想分配会话变量并转到我的索引页面。最开始有这段代码:

 //Session Timeout Script -- used to determine the amount of time the user has been idle.  If it the user has been idle for longer then the session time, log the user out.
 //Secondary to the Timeout Script, the username and ip address is checked for validility and if either fails redirect the user to the login page. 
 session_cache_expire( 20 );
 session_start(); 

 $inactive = 1200;     

 if(isset($_SESSION['start']) ) {
      $session_life = time() - $_SESSION['start'];
  if($session_life > $inactive){
        header("Location: logout.php");
   }
}

  $_SESSION['start'] = time();

    $newip = $_SERVER['REMOTE_ADDR']; 
   if (!isset($_SESSION['username']) ||  empty($_SESSION['username']) || $newip!=    $_SESSION['ip']) { 
 header('Location: login.php'); 
} 

现在阅读前一位作者的问题,提到 header() 应该是在发送重定向的代码中执行的第一件事,在我的例子中是 login.php。这样做可以让我登录,但是当我注销时,我正在销毁所有会话并使用 header() 将我送回登录页面。这反过来会使登录页面重定向回索引页面,因为它读取了第一行代码。有没有办法避免这种情况?所以我不需要重复我在 login.php 顶部已经存在的一些代码逻辑?

安德烈

【问题讨论】:

    标签: php session header


    【解决方案1】:

    是的,header 必须在 any 其他输出之前调用,它是 http 本身需要的,没有办法绕过它。不过你可以在session_start()之后调用header。

    所以你可以开始会话,检查来自$_POST的登录数据,然后开始html输出。

    顺便说一句,为什么要连续使用三个session_name

    【讨论】:

    • 好吧,我现在在任何 html 输出之前移动了 if else 块(帖子中显示的 else 块)并删除了 session_name,以
    • 忽略这个帖子 Cek,罪魁祸首是空间过大
    【解决方案2】:

    header 函数也有类似的问题。
    首先确保您的 .php 文件的开始结束没有空格。
    这样的事情有时会导致这些错误:

       <?php
    //Codes...
    

    如您所见,PHP 标记开始前有一个空格。当您的 PHP 代码与 HTML 混合时,它会导致荒谬的错误。
    据我所知,session_start() 函数的调用必须是打开 PHP 标记后文件最开头的第一行代码。
    我很确定这在不久前给我带来了一些问题。

    【讨论】:

    • 哦,还有一件事。据我记得你不能多次调用 header() 函数。级联是不可能的。
    • 好的,再次阅读错误,它声称输出已经发送到我拥有的包含文件,该文件在我的 header() 执行之前。现在我进入那个文件并删除了间距和它现在的工作非常感谢 M2X。
    • 当然! ;-] 不要忘记将问题标记为已回答其他可能遇到此问题的人。
    【解决方案3】:

    您可能还想使用输出缓冲。请参阅OB tasks 上的 PHP 手册。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2013-11-24
      • 2012-03-31
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多