【发布时间】:2014-12-18 21:25:07
【问题描述】:
大多数关于不添加会话变量的答案都以用户发现会话没有启动而告终。
我遇到了一个问题,即使在 session_start 之后,我也无法添加会话变量。
相关代码:
登录.php
<?php
require("../common.php");
if(!empty($_SESSION['user'])) {
echo "true";
header("Location: dashboard.php");
die("Redirecting to dashboard.php");
}
$submitted_username = '';
if(!empty($_POST)) {
$info = " SELECT id, username, password, salt, email, access FROM users WHERE username = :username ";
$params = array( ':username' => $_POST['username'] );
try {
$stmt = $db->prepare($info);
$result = $stmt->execute($params);
} catch(PDOException $ex) {
die("Failed to run query");
}
$login_ok = false;
$row = $stmt->fetch();
if($row) {
$check_password = hash('sha256', $_POST['password'] . $row['salt']);
for($round = 0; $round < 65536; $round++) {
$check_password = hash('sha256', $check_password . $row['salt']);
}
if($check_password === $row['password']) {
$login_ok = true;
}
}
if($login_ok) {
unset($row['salt']);
unset($row['password']);
$_SESSION['user'] = $row;
$_SESSION['access'] = "1";
header("Location: dashboard.php");
session_write_close();
die("Redirecting to: dashboard.php");
} else {
echo "<div id=\"loginfail\" class=\"gradwin\">\n";
echo " <p class=\"dark1\">LOGIN FAILURE</p>\n";
echo "</div>\n";
$submitted_username = htmlentities($_POST['username'], ENT_QUOTES, 'UTF-8');
}
}
?>
<div id="loginbox" class="gradwin">
<p class="darktitle">HITS Login</p>
<form action="index.php" method="post" name="formLogin">
<!-- fake fields for Chrome autofill... -->
<input style="display:none" type="text" name="fakeusername"/>
<input style="display:none" type="password" name="fakepassword"/>
<p class="dark1">Username:</p>
<input type="text" name="username" autocomplete="off"><br>
<p class="dark1">Password:</p>
<input type="password" name="password" autocomplete="off"><br><br>
<input type="submit" value="Login" name="loginForm"><br><br>
</form>
<a class="dark" href="register.php">Register</a>
</div>
common.php
<?php
$username = "MYNAME";
$password = "MYPASS";
$host = "localhost";
$dbname = "MYDB";
$conn = new mysqli($host, $username, $password, $dbname);
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
try {
$db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options);
} catch(PDOException $ex) {
die("Failed to connect to the database: " . $ex->getMessage());
}
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
header('Content-Type: text/html; charset=utf-8');
session_start();
我被重定向到dashboard.php 页面,所以我知道有一个会话已启动。 session_start 在 common.php 文件中。我已经放置...
echo '<pre>';
var_dump($_SESSION);
echo '</pre>';
...在dashboard.php 文件中。我可以看到所有相关的用户数据,但看不到访问数据。我的数组回显如下:
array(1) {
["user"]=>
array(3) {
["id"]=>
string(2) "11"
["username"]=>
string(2) "ba"
["email"]=>
string(9) "ba@ba.com"
}
}
【问题讨论】:
-
session_start()在哪里?这些文件是否在同一个(子)域上? -
通用文件在webroot之外,比我的login.php和dashboard.php文件高一级。
-
common.php是什么样子的,你可能在那里手动设置了$_SESSION['user']? -
你只是假设 session_start() 成功了。检查它的返回值。如果为假,则会话不会开始。