2011-06-08 44 views
0

代碼:問題的會議在PHP

<?php 
include ("conf/conf.php"); 
include ("classes/dbhelper.php"); 
$conf = new Dbconf(); 
$dbURL = $conf->get_databaseURL(); 
$dbUName = $conf->get_databaseUName(); 
$dbPword = $conf->get_databasePWord(); 
$dbName = $conf->get_databaseName(); 
$nameOfDbWithWorkers = $conf->get_nameOfDbWithWorkers(); 

if($_POST['auth']){ 
    $login = trim(($_POST['login'])); 
    $pass = trim($_POST['pass']); 

    $dbHelp = new DbHelper($dbURL, $dbUName, $dbPword, $dbName, $nameOfDbWithWorkers); 
    $userType = $dbHelp->getUser($login, $pass); 

    switch ($userType){ 
    case "admin": 
     startSession($login, $pass); 
     header("Location: adminpage.php"); 
     break; 
    case "user": 
     startSession($login, $pass); 
     header("Location: operatorpage.php"); 
     break; 
    case "nomatch": 
    echo 
    '<html> 
    <body> 
    <table width=100% height=100% border=0 cellpadding=0 cellspacing=0> 
     <tr valign="center" align="center"> 
      <td> 
       <form action="authorize.php" method="post"> 
       Логин:<input type="text" name="login"><br> 
       Пароль:<input type="password" name="pass"><br> 
       <input type="submit" name="auth"> 
       <font color = red> Неправильный пароль или логин</font> 
      </td> 
     </tr> 
    </table> 

    </form> 
    </body> 
    </html>'; 
     break; 
    }  
} 
else{ 
    header("Location: index.php"); 
} 
    function startSession($login, $pass){ 
     session_start(); 
     $_SESSION['login'] = $login; 
     $_SESSION['pass'] = $pass; 
     $_SESSION['usr_id'] = md5(crypt($login,$pass)); 
    } 

當我輸入正確的用戶名和傳遞信息,我有下一個錯誤。

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\ecl.ru\www\classes\dbhelper.php:24) in Z:\home\ecl.ru\www\authorize.php on line 20 

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at Z:\home\ecl.ru\www\classes\dbhelper.php:24) in Z:\home\ecl.ru\www\authorize.php on line 53 

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at Z:\home\ecl.ru\www\classes\dbhelper.php:24) in Z:\home\ecl.ru\www\authorize.php on line 53 

如何解決這個問題?

+2

session_start()應該是你的php文件的第一行。在發送任何聽衆之前 – 2011-06-08 10:55:50

回答

1

有輸出在你的文件dphelper.php,作爲通知說了一句:

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\ecl.ru\www\classes\dbhelper.php:24) in Z:\home\ecl.ru\www\authorize.php on line 20 

頁眉是任何類型的輸出前發送,你的session_start()可能會爲時已晚。正如人們已經說過的,一個建議是將session_start()放在文件的頂部,另一個(可以與第一個一起實現) - 查看dbhelper.php並確保它不輸出任何內容(來自無論如何,它不應該)。而且,當我說「輸出」時,它不一定是echo/print/etc,它也可以是在文件末尾關閉php標籤後的空白區域。

2

您需要在做任何事情之前開始會話。 Read the docs

+2

只是爲了澄清一點,您需要在任何輸出發送到客戶端之前調用'session_start()'。因此,在調用會話開始之前,不能輸出html標籤! – gnur 2011-06-08 10:56:21

1

你可以通過啓用output buffering來解決這個問題,這樣頭文件將始終在數據之前發送。

0

看看你的代碼,在會話開始之前沒有明顯的發送任何內容,但是,你有各種函數調用。做他們任何一個輸出內容?

這是完整的文件嗎?即使<?php前行迴歸將算作發送給瀏覽器的內容....

1

用頭

0

只要把session_start();頂部之前啓動會話的包括此之前,當你在任何地方打電話給你的startSession功能在你的代碼它只會設置您分配給$ _SESSION的任何值。