2010-11-13 100 views
5

我的问题有点类似下面的帖子..警告:不能更改头信息 - 头已经发送(PHP)

PHP error: Cannot modify header information – headers already sent

但在我的情况下,我选择一次,我决定在那里开始的会话没有来自登录表单的验证错误,并且用户的登录信息与数据库的信息匹配。这是下面的代码:

登录页面(任何HTML之前)

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

的login.php摘要(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"); 
      } 
     } 
    } 

} 
如果你看的其他块

上面的代码我正在验证登录,如果它的好,我想分配会话变量并进入我的索引页面。其在一开始就这样的代码:

//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'); 
} 

现在通过从以前的作者问题看书,有人提到,头()应该是在代码执行的第一件事,多数民众赞成在发送重定向,这在我的情况是login.php。这样做可以让我登录,但是当我注销时,我会销毁所有会话,并使用header()将我发回登录页面。这又会使登录页面重定向回到索引页面,因为它的第一行代码被读取。有没有办法避免这种情况?所以我不需要重复我已经在login.php顶部的一些代码逻辑?

安德烈

回答

3

我有一种类似的问题与功能。所有的
首先确保有在没有空白开始,并在您的.PHP文件
像这样的事情会导致这些类型的错误的某个时候:

<?php 
//Codes... 

正如你可以看到,还有就是PHP标签开始前的一个空白。当您的PHP代码与HTML混合在一起时,它会导致可笑的错误。
据我所知,打开PHP标签后,调用session_start()函数必须是文件开头的第一行代码。
我很确定这让我在一段时间后面有些问题。

+1

哦,还有一件事。据我记得你不能有多个调用header()函数。级联是不可能的。 – M2X 2010-11-13 17:42:20

+0

确定再次读取错误,它声明输出已经发送到包含文件,我已经在我的header()执行之前。现在我去了那个文件,并删除了间距,现在它的工作感谢ALX M2X。 – Andre 2010-11-13 22:06:31

+0

当然! ; - ]不要忘记将问题标记为可能会遇到此问题的其他人回答。 – M2X 2010-11-14 06:11:37

4

是的,header必须在之前调用其他任何其他输出,这是http本身所需要的,没有办法绕过它。但是,您可以在session_start()之后调用标题。

所以你可以开始会话,检查从$_POST登录数据,并启动html输出。

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

+0

好吧,我现在在任何html输出之前移动了我的if else块(else后面的块),并删除了session_name的,用<?开头的代码。在session_start()。但错误仍然存​​在..我按照你推荐的方法行事。现在可以将header()保留在我的else块中的位置吗?由于没有输出完成,它只是在发布后检查登录数据。 – Andre 2010-11-13 21:45:27

+0

忽略此帖Cek,罪魁祸首是多余的空间 – Andre 2010-11-13 22:07:32

1

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

相关问题