2012-02-17 111 views
4

我最近才從我的ASP洞中出現,並且無法適應PHP的陽光。創建PHP會話變量會掛起我的瀏覽器

我目前的問題在於一個簡單的登錄序列,我在其中創建一個會話變量 - 該步驟導致我的瀏覽器掛起,然後不正常行爲。

從我的登錄頁面(A.php)登錄表單被定向到B.php(下面),它處理密碼,創建會話變量,然後將用戶重定向到另一個文件(C.php)。

爲簡潔起見,我只是假設登錄成功。 B.php包含以下內容:

<?php 
session_start(); 
require "../scripts/base/toolbox.php"; 

fnProcessLogin(); 

function fnProcessLogin(){ 
    $passwd = strtoupper($_POST["passwd"]); 
    if (strlen($passwd)==0) 
    { 
    $passwd=strtoupper($_SESSION['plpassword']); 
    unset($_SESSION['plpassword']); 
    } 
    try{ 
    $db = Database::getDB(); 
    $sql="SELECT securitylevel, staffID, staffname, stafflname, staffemail, iRoleID FROM staff WHERE staffpasswd=?;"; 
    $data = array($passwd); 
    $query = $db->prepare($sql); 
    $query->execute($data); 
    if($query->rowCount()>0){ 
     $row = $query->fetch(); 
     $a=$passwd."|".$row['staffID']."|".$row['staffname']."|".$row['stafflname']."|".$row['staffemail']."|".$row['iRoleID']; 
     $_SESSION['admin'] = $a; 
     header('Location: C.php'); 
    } 

} 
    catch(PDOException $pe){ 
    echo "We are sorry, but we cannot complete this database operation."; 
    file_put_contents('PDOerrors.txt',$pe->getMessage(),FILE_APPEND); 
    } 
} 

?> 

如果我註釋掉「$ _SESSION ['admin'] = $ a;」行,重定向工作正常,但只要我嘗試創建會話變量,我的瀏覽器掛起,直到最終轉到C.php它無法正確加載任何文件。後退按鈕動作似乎將瀏覽器置於無限循環中。

這個穴居人做錯了什麼?

謝謝,

Brian。

+0

「掛我的瀏覽器」奧利? – 2012-02-17 11:41:27

+0

你爲什麼要把密碼寫成大寫?或者我讀錯了嗎? – PeeHaa 2012-02-17 11:46:08

+1

另外:你真的需要在會話中存儲密碼嗎?爲什麼不使用多維數組來爲用戶數據添加'$ _SESSION',而是一個字符串(用'|'分隔)? – PeeHaa 2012-02-17 11:48:29

回答

2

我只是在這裏猜測。

您需要在位置標題後有一個exit();。如果在重定向之後輸出更多數據(例如可能會試圖設置cookie的會話),則重定向將失敗。

給它一個測試,看看會發生什麼。

您也可以在會話分配後嘗試session_write_close()以在嘗試重定向之前強制完成所有與會話相關的數據。不過,我仍然強烈推薦exit();

+0

謝謝Leigh,但這兩種選擇都沒有什麼區別。我也改變了重定向到這個頁面(以防萬一C.php出錯)。重定向很好,但如果我回到B.php,系統將永遠連接到頁面,然後所有包含文件都不會被讀取,並且頁面中會填充PHP錯誤通知。莫名其妙! – Bruce 2012-02-17 19:56:05

+0

@ user1216097:如果對這些事情有疑問,我通常會前往'tcpdump'。 – Leigh 2012-02-17 20:57:16