PHP$\u会话的问题;

PHP$\u会话的问题;,php,session,Php,Session,当用户登录时,我使用会话存储数据库中的数据。但是,当我在另一个页面上查询数据库时,会话变量会发生变化,而我不会为它们分配新的值 有人知道问题出在哪里吗 保存变量的登录页面: enter code here session_start(); if($_POST['login_button']) { require_once('includes/config.inc.php'); $username = $_POST['login_username'];

当用户登录时,我使用会话存储数据库中的数据。但是,当我在另一个页面上查询数据库时,会话变量会发生变化,而我不会为它们分配新的值

有人知道问题出在哪里吗

保存变量的登录页面:

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:我意识到只有当我再次查询数据库时才会发生这种情况

导致问题的原因是(在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)) {

    // if i change $id to $user_id it breaks the login script 
$id = $row['user_id'];
$name = $row['name'];

}

原因可能是,如果您的页面正在从http切换到https或不同的服务器,这将导致创建新的会话id。

您的浏览器记录会话的cookie,并为来自同一浏览器实例的同一域的所有调用返回cookie。(也就是说,如果你发布了两个不同的ie或FireFox副本,它们可能有不同的会话

除了加载和存储之外,PHP不会对会话执行任何操作。更改会话变量的唯一方法是您自己从服务器页面更改它们。另一个问题可能是在存储/检索会话时序列化/反序列化会话。如果您有复杂的类,它们可能会在翻译

也许您可以创建一个页面来显示会话变量的内容,在浏览器的新选项卡中启动它,并在每次对其他选项卡执行页面更新时刷新它


我怀疑这是程序员错误:请更换程序员,然后重试。

尝试删除对的调用

session_write_close()

正如我所听到的,这会导致会话出现一些问题。

我得到的第一个印象是,您在验证客户端后立即关闭会话,对吗

// 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;
}
看看逻辑部分,让我知道它是否解决了您的问题


希望能有所帮助。

问题似乎在于register\u globals打开的


感谢所有试图回答我提出一个简单问题的过于复杂的方式的人:)

我有一个页面来显示会议的内容。当它第一次加载时,所有内容都会出现,但当它刷新时,会话$\u session['name']会消失。我已尝试删除session\u write\u close();但问题仍然存在。
// 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;
}