我正在爲一個機器人團隊編寫PHP登錄系統。登錄系統的流程如下。通過頭部重定向傳遞PHP會話變量
- 在索引頁上,它檢查$ _SESSION ['log_info']是否設置爲'true',如果是,顯示成員的內容。如果它是假的,它會顯示一個登錄頁面。
- 然後,登錄後,它進入login.php連接到數據庫並檢查用戶憑證是否匹配等。它將$ _SESSION ['log_info']存儲到與login.php頁面上的事件對應的一系列值。
- 然後它重定向到讀取$ _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();
}
?>
Theres沒有真正需要session_write_close(),那不是你的問題,但它有點在這裏沒用 – KyleK
我添加它只是爲了確保它不是問題。我將最終拿出它 –
最好的行動方式是把'error_reporting(E_ALL);'放在兩頁的頂部,並尋找錯誤的跡象 – DevZer0