2010-11-13 136 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手冊。

相關問題