2013-06-27 76 views
1

我正在爲一個機器人團隊編寫PHP登錄系統。登錄系統的流程如下。通過頭部重定向傳遞PHP會話變量

  1. 在索引頁上,它檢查$ _SESSION ['log_info']是否設置爲'true',如果是,顯示成員的內容。如果它是假的,它會顯示一個登錄頁面。
  2. 然後,登錄後,它進入login.php連接到數據庫並檢查用戶憑證是否匹配等。它將$ _SESSION ['log_info']存儲到與login.php頁面上的事件對應的一系列值。
  3. 然後它重定向到讀取$ _SESSION ['log_info'](因此知道login.php頁面的狀態)的索引頁面,併爲不同的值執行操作。

我的問題是會話變量沒有通過login.php頁面上的重定向。它們是空的。

事情我已經確認並正在工作:

  • 我已籤,他們正在建立,他們是。 (我可以在login.php頁面上回顯它們。)
  • 我也知道重定向工作,因爲我可以更改標題語句的位置,它的所有功能都可以正常工作。
  • 我也知道PHP會話cookie在整個考驗過程中都保持不變,所以也不是這樣。
  • 我有sessions_start();在我的所有網頁上。

下面是兩頁的代碼:

的index.php

<?php // this is first line of page 
session_start(); 

// If user is not logged in, sets $log_info == 'false' 
if (!isset($_SESSION['log_info']) || $_SESSION['log_info'] == '' || $_SESSION['log_info'] == '0') { $_SESSION['log_info'] = 'false'; } 

function get_banner() { 
    // Switch statement for all cases of $log_info... Usually displays banner to user... 
    switch ($_SESSION['log_info']) { 
    case 'true': 
     echo '<div class="banner">You are logged in!</div>'; 
     $_SESSION['log_info'] = ''; 
     break; 

    case 'false': 
     echo '<div class="banner">Please login below.</div>'; 
     $_SESSION['log_info'] = ''; 
     break; 

    case 'error': 
     echo '<div class="banner">Your username or password do not match.</div>'; 
     $_SESSION['log_info'] = ''; 
     break; 

    case 'acc_fail_username': 
     echo '<div class="banner"><b>Account creation failed:</b><br/>Your selected username already exists. Please pick a different one.</div>'; 
     $_SESSION['log_info'] = ''; 
     break; 

    case 'acc_fail_parm': 
     echo '<div class="banner"><b>Account creation failed:</b><br/>One or more of your entry fields were invalid. Please try again.</div>'; 
     $_SESSION['log_info'] = ''; 
     break; 

    case 'acc_success': 
     echo '<div class="banner">Your account was successfully created! Login below.</div>'; 
     $_SESSION['log_info'] = ''; 
     break; 

    default: 
     $_SESSION['log_info'] = ''; 
     //die('Something went wrong internally. Please stay calm while we fix it'); 
    } 
} 

?> 

<?php get_banner(); ?> 

<b>Login:</b> 

<form action="login.php" method="post"> 
Username: <input type="text" name="username"><br/> 
Password: <input type="password" name="password"><br/> 
<input type="submit"> 
</form> 

的login.php

<?php // this is first line of page 
session_start(); 

// Connect and verify connection 
$con = @mysqli_connect($host, $username, $password, $dbname); 

$username = $_POST['username']; 
$password = $_POST['password']; 

$query = mysqli_query($con, "SELECT * FROM FRC4096users WHERE  username='".$username."'"); 
$row = mysqli_fetch_array($query); 

$salt = $row['salt']; 

if ($row['passwordhash'] === hash('sha512', $password . $salt)) { 
    $salt = hash('sha512', rand()); 
    mysqli_query($con, "UPDATE users SET salt='". $salt ."' WHERE  username='".$username."'"); // Resets salt on login for security 
    mysqli_query($con, "UPDATE users SET passwordhash='". hash('sha512', $password .  $salt) ."' WHERE username='".$username."'"); // Resets salt on login for security 
    $_SESSION['log_info'] = 'true'; 
    session_write_close(); 
    header('Location: /'); 
    die(); 
} else { 
    $_SESSION['log_info'] = 'error'; 
    session_write_close(); 
    header('Location: /'); 
    die(); 
} 

?> 
+0

Theres沒有真正需要session_write_close(),那不是你的問題,但它有點在這裏沒用 – KyleK

+0

我添加它只是爲了確保它不是問題。我將最終拿出它 –

+0

最好的行動方式是把'error_reporting(E_ALL);'放在兩頁的頂部,並尋找錯誤的跡象 – DevZer0

回答

0

您應該嘗試幾件事:

  1. 檢查所有域是否都是相同的。當您更改域名時,會話會發生變化。
  2. 查看存儲會話的臨時文件夾。嘗試監視以查看是否有某些內容正在擦除文件中的數據。
  3. 在您的項目文件中搜索您可能不知道的任何session_destroy()
  4. 從您的文件中刪除session_write_close(),因爲這是在解析結束時自動執行的,並且您的腳本很短。
  5. 嘗試在開始會話之前使用error_reporting(E_ALL);更改錯誤報告級別。
  6. 也許在所有頁面中的print_r($_SESSION)可以幫助您找到數據將要消失的地方。

這可能會幫助您檢測出錯位置。

祝你好運!如果

0

你這樣做....

<?php // this is first line of page 
    session_start(); 

    if (!isset($_SESSION['log_info']){ header('Location: /login.php');die();} 
    else { 

switch ($_SESSION['log_info']) { 
    case 'true': echo '<div class="banner">You are logged in!</div>'; 
    unset($_SESSION['log_info']); 
    break; 

    case 'false': 
    echo '<div class="banner">Please login below.</div>'; 
    unset($_SESSION['log_info']); 
    break; 

case 'error': 
    echo '<div class="banner">Your username or password do not match.</div>'; 
    unset($_SESSION['log_info']); 
    break; 

case 'acc_fail_username': 
    echo '<div class="banner"><b>Account creation failed:</b><br/>Your selected username already exists. Please pick a different one.</div>'; 
    $_SESSION['log_info'] = ''; 
    break; 

case 'acc_fail_parm': 
    echo '<div class="banner"><b>Account creation failed:</b><br/>One or more of your entry fields were invalid. Please try again.</div>'; 
    unset($_SESSION['log_info']); 
    break; 

case 'acc_success': 
    echo '<div class="banner">Your account was successfully created! Login below.</div>'; 
    unset($_SESSION['log_info']); 
    break; 

default: 
    unset($_SESSION['log_info']); 
    break; 
    } 
} 
?> 


<b>Login:</b> 

<form action="login.php" method="post"> 
Username: <input type="text" name="username"><br/> 
Password: <input type="password" name="password"><br/> 
<input type="submit"> 
</form> 

那麼你的登錄頁面上,有這...頂部....其餘是一樣的....

<?php // this is first line of page 
    session_start(); 
    session_unset(); 
//rest of code 
+0

我剛剛嘗試了我的個人Web服務器上的相同的代碼與數據庫的副本我的主機和代碼工作完美。 URGH。現在我必須弄清楚我的團隊的服務器有哪些設置錯誤...有什麼想法? –

+0

也許嘗試運行<?php phpinfo();?>並查看會話是否已啓用? – KyleK

+0

嗯,我做了,session.use_only_cookies在工作代碼上,而在非工作代碼中關閉。我會嘗試讓網站管理員更改設置,看看它是否解決了問題! –