2009-08-24 22 views
0

我正在使用PHP做一個簡單的動態網站,我允許用戶登錄,然後訪問特定頁面。所以這就是我迄今爲止所做的。提供登錄檢查,頁面重定向在所有頁面php

登錄的值是通過php腳本中的$ _POST變量獲取的,它從註冊用戶的數據庫中獲取值。如果用戶發現我做到以下幾點:

session_register('userid'); 
$_SESSION['userid'] = $username;//this is taken from $_POST 
$_SESSION['accesslevel'] = $access; 

在PHP腳本我已經把session_start();

現在,這裏的開頭說到我的問題。

在每一頁現在我必須檢查用戶是否被允許查看該頁面,如果他不是,那麼他必須重定向到login.php,如果他是那麼頁面加載必須繼續。

現在爲止我所瞭解到的是,只有在整個PHP頁面保持價值的方式是使用$_SESSION變量,並不斷頁我使用的會話變量我必須在每個頁面的第一行寫上session_start(),否則我會得到頭已發送錯誤..

奇怪的是,我已經完成了,但仍然得到與「頭已發送」erros。

所以我想什麼是設計一個網站,在那裏我必須使用Session變量在大部分的網頁,並保持這些常見的檢查,在一個共同的地方最好的方式..

  • 我可以使用include()功能如何?
  • 會話是通過php頁面進行數據通信的唯一途徑。
  • 什麼是更好的方法?

我有以下代碼:

<?php 
session_start(); 
if(!isset($_SESSION['user'])) 
{ 
    $_SESSION['loc'] = "adminhome.php"; 
    header("location:ettschoollogin.php"); 
    exit(); 
} 
    ?> 

駐留在每一個它要檢查,如果用戶已經登錄頁面的頂部

這是德腳本檢查登錄

<?php 
session_start(); 
include("connection.php"); 
$userid =$_POST['userid']; 
$userpwd =$_POST['userpwd']; 

$query="Select UNAME,UPASSWORD,SCHOOL,uaccess from schooluser where uname = '$userid'"; 

$result=mysql_query($query) or die("couldn't execute the query"); 
$row=mysql_fetch_array($result); 
$useraccess = $row["uaccess"]; 


$school =$row[2]; 

if(($row[0]==$userid)&&($row[1]==$userpwd)) 
{ 
     session_register('userid'); 
     $_SESSION['userid']=$userid; 
     $_SESSION['school']=$school; 

    if($useraccess =="admin") 
    {  
     header("Location:adminhome.php"); 
    } 

    if($useraccess !="admin") 
    { 
     header("Location:school_main.php"); 

    } 
} 
else 
{ 
    header("Location:ettschoollogin.php?err=1"); 
} 
?> 

我知道有額外的空間的常見錯誤後「?>」,但我仍然得到它。

謝謝你們,我錯過了,「connection.php」文件實際上在「?>」之前有多餘的空格,但之前我已經刪除了它,但有些文件是如何重寫的。謝謝。

+0

沒有什麼不對您的代碼。你確定它不在頂部空行開始?在此之前你還沒有發送任何HTML? 如果沒有,你必須還包括別的,防止這種工作,所以在session_start其實也不是輸出的東西的第一個語句。也許有一些錯誤信息? – Palantir 2009-08-24 13:31:05

回答

2

是的,你可以使用包括。將所有常用函數放在一個單獨的php文件中,並將其包含在每個文件的頂部。

您可以使用Cookie來存儲信息(通常只是你用來查找PHP頁面中附加信息的ID)。通常,PHP會話是使用Cookie處理的。請參閱文檔中的setcookie

你可能會收到錯誤消息由於<?php ?>塊外雜散字符。一個常見的錯誤是在包含文件末尾有一個額外的空行,在?>之後。該空白行將被輸出並且您的標題將被髮送。如果這不是問題,那麼您只需確保將會話相關代碼移動到可能生成某些輸出的任何代碼之上(例如,使用打印或回顯)即可。

2

•我可以使用include()功能嗎?

是的。在session_start()調用之前,你可以做任何你想做的事情,只有你不能輸出任何東西,甚至不能輸入任何空格或字符。可能你已經輸出了一些東西,可能是自動包含或者apache前置。

•會話是否只能通過php頁面進行數據通信。 •什麼是更好的方法?

其它方式餅乾POST和GET參數。但會話安全傳遞的網頁中的數據,而不將它們發送到客戶端和背部的唯一方法(這可能會帶來安全隱患)

1

ob_start();在你的代碼的頂部,那麼你沒有得到的錯誤「頭已經發送」