当用户登录时,我正在使用SESSIONS来存储来自数据库的数据。但是,当我在另一个页面上查询数据库时,SESSION变量在没有为其分配新值的情况下发生变化。
有谁知道问题可能是什么?
保存变量的登录页面:
enter code here
session_start();
if($_POST['login_button']) {
require_once('includes/config.inc.php');
$username = $_POST['login_username'];
$password = $_POST['login_password'];
$hash_pwd = sha1($password);
if(($username != NULL) && ($password != NULL)) {
$conn = mysql_connect('localhost', 'admin', 'root') or die(mysql_error());
mysql_select_db('main') or die(mysql_error());
$check_users = "SELECT * ".
"FROM users ".
"WHERE email = '{$username}' AND password = '{$hash_pwd}' ".
"LIMIT 1";
$result = mysql_query($check_users);
$counted = mysql_num_rows($result);
if($counted != 1) {
header("location:login.php?fail"); } else {
while ($row = mysql_fetch_array($result)) {
$useR_login_un = $row['name'];
$useR_login_user_id = $row['user_id'];
$useR_login_login_time = $row['login_times'];
$useR_login_user_email = $row['email'];
$useR_login_course = $row['course'];
$useR_login_campus = $row['campus'];
$useR_login_login_time = $useR_login_login_time + 1;
$useR_login_datenow = date("Y-m-d") . " " . date("H:i:s");
$useR_login_sid = sha1($useR_login_user_id) . rand() . md5($pinch_o_salt);
$update_login_times = "UPDATE users ".
"SET login_times = '{$useR_login_login_time}', last_login = '{$useR_login_datenow}' ".
"WHERE email = '{$useR_login_user_email}' AND user_id = '{$useR_login_user_id}'";
mysql_query($update_login_times);
mysql_close($conn);
$_SESSION['sid'] = sha1($useR_login_user_id) . $pinch_o_salt;
$_SESSION['user_id'] = $useR_login_user_id;
$_SESSION['username'] = $useR_login_user_email;
$_SESSION['name'] = $useR_login_un;
$_SESSION['course'] = $useR_login_course;
if($useR_login_login_time == 0) {
session_write_close();
header("Location: first_run.php");
exit;
}
else {
session_write_close();
header("Location: home.php");
exit;
}
}
}
} else { header("Location: login.php?fail"); exit; } }
编辑:它存储变量,当我转到另一个页面时,变量出现,但是当我刷新时,其中一些丢失,其中一些保持不变,一些变为来自数据库中另一个用户的信息。
EDIT2:我意识到这只会在我再次查询数据库时发生。
导致问题的是(ON home.php):
$conn = mysql_connect('localhost', 'ggordan_admin', 'valeg0r') or die(mysql_error());
mysql_select_db('ggordan_wmin') or die(mysql_error());
$query = "SELECT * ".
"FROM users ".
"WHERE course = '".$_SESSION['course']."' ".
"LIMIT 3";
$result = mysql_query($query);
$numrows = mysql_num_rows($result);
echo $numrows;
while ($my = mysql_fetch_array($result)) {
$id = $row['user_id'];
$name = $row['name'];
}
如果我发表评论,似乎不会发生。
编辑:我意识到它与另一个脚本上的变量冲突有关。应该发生这种情况$conn = mysql_connect('localhost', 'ggordan_admin', 'valeg0r') or die(mysql_error());
mysql_select_db('ggordan_wmin') or die(mysql_error());
$query = "SELECT * ".
"FROM users ".
"WHERE course = '".$_SESSION['course']."' ".
"LIMIT 3";
$result = mysql_query($query);
$numrows = mysql_num_rows($result);
echo $numrows;
while ($my = mysql_fetch_array($result)) {
// if i change $id to $user_id it breaks the login script
$id = $row['user_id'];
$name = $row['name'];
}
答案 0 :(得分:1)
原因可能是,如果您的网页从http切换到https或不同的服务器,这将导致创建新的会话ID。
答案 1 :(得分:0)
您的浏览器记录会话的cookie,并从同一浏览器实例返回同一域的所有调用。 (即,如果您启动了两个不同的IE或FireFox副本,它们可能会有不同的会话。
PHP不会对加载和存储以外的会话执行任何操作。会话变量更改的唯一方法是从服务器页面自行更改它们。另一个问题可能是在存储/检索会话时序列化/反序列化会话。如果你有复杂的课程,他们可能会在翻译中感到困惑。
也许您可以创建一个页面来显示会话变量的内容,在浏览器的新选项卡中启动它,并在每次在其他选项卡上执行页面更新时刷新它。
我怀疑这是程序员错误:替换程序员并重试。
答案 2 :(得分:0)
尝试删除对
的调用session_write_close()
我听说这会导致会话出现问题。
答案 3 :(得分:0)
我得到的第一印象是,在客户端验证后,您正在关闭会话,我是对的吗?
// if user does not validate close session and take him back to login
if($useR_login_login_time == 0) {
session_write_close();
header("Location: first_run.php");
exit;
}
// if user validates DO NO CLOSE SESSION and take him home
else {
//session_write_close();
header("Location: home.php");
exit;
}
看看那个逻辑部分,让我知道它是否能解决你的问题!
希望它有所帮助。
答案 4 :(得分:0)
似乎问题是 register_globals 。
感谢所有试图回答我过于复杂的问一个简单问题的人:)