Проблемы с сеансами PHP на сервере, но не на локальном хосте

Я передаю пользовательскую переменную через сеансы. Он отлично работает на локальном хосте, но однажды на веб-сервере он делает странные вещи.

После входа в систему переменная сеанса работает так, как должна... пока вы не нажмете примерно на три страницы, и она внезапно не сорвется!

Обратите внимание на «Welcome, jordan.», а не на «Welcome, .». Также в верхнем левом углу.

Работа сеанса: http://imageshack.us/photo/my-images/32/loggedins.png/

Сессия ПУФ! http://imageshack.us/photo/my-images/515/loggedinno.png/

Код входа/создания переменной сеанса:

<?php
        if (!isset($_SESSION['user']))
        {
        if (isset($_POST['user']))
        {
        $user = sanitizeString($_POST['user']);
        $pass = sanitizeString($_POST['pass']);
        if (preg_match($txtMatch,$user))
        {
        if ($user == "" || $pass == "")
        {
        $error = "Please enter all required fields";
        }
        else
        {
        $query = "SELECT * FROM gtmembers WHERE user='$user'";
        $result = queryMysql($query);
        $rank = mysql_result($result, 0, 'rank');
        if (!mysql_num_rows($result))
        {
        $error = "Username does not exist.";
        }
        else
        {
        $getPass = mysql_result($result, 0, 'pass');
        $salt = substr($getPass, 0, 64);
        $hash = $salt . $pass;
        for ($i = 0; $i < 100000; $i++) 
        {
        $hash = hash('sha256', $hash);
        }
        $hash = $salt . $hash;
        if ($hash == $getPass)
        {
        if ($rank != "Banned")
        {
        $userLow = strtolower($user);
        $_SESSION['user'] = $userLow;
        $_SESSION['rank'] = $rank;
        echo <<<_END
        <script type="text/javascript">
        window.location.href='index.php';
        </script>
        _END;
        echo "Successfully logged in. Click <a href='index.php'>here</a> to continue.";
        }

Код заголовка:

        <?php //gtheader.php
        session_start();
        include_once 'gtfunctions.php';
        $loggedIn = FALSE;

        if (isset($_SESSION['user']))
        {
        $user = $_SESSION['user'];
        if ($user) echo "Current User: $user<br />";
        else echo "Current User: None<br />";
        $rank = $_SESSION['rank'];
        $loggedIn = TRUE;
        echo "is set SESSION['user']? Yes";
        }
        else echo "is set SESSION['user']? No";

        echo "<div id='header'><a class='header' href='index.php'> <h1 id='headerTitle'>$appname</h1></a>";
        if ($loggedIn == TRUE)
        {
        $query = "SELECT * FROM gtmessages WHERE recip='$user' AND status='0'";
        $result = queryMysql($query);
        if (mysql_num_rows($result) == 0) $num = "";
        else $num = "[".mysql_num_rows($result)."]";
        if ($rank == 'Owner' || $rank == 'Admin')
        {
        echo "Welcome, <a class='header' href='gtmembers.php?view=$user'>$user</a><a     class='header' href='gtmessage.php'>$num</a>. [<a class='header'     href='gtlogout.php'>Logout</a>] | <a class='header' href='gtadmin.php'>Admin</a><br />";
        }
        else
        {
        echo "Welcome, <a class='header' href='gtmembers.php?view=$user'>$user</a><a     class='header' href='gtmessage.php'>$num</a>. [<a class='header'     href='gtlogout.php'>Logout</a>]<br />";
        }
        }
?>

person user2058050    schedule 22.03.2013    source источник
comment
Вы где-нибудь вызываете session_start?   -  person Adam Plocher    schedule 22.03.2013
comment
@AdamPlocher, наверное, иначе бы это вообще не сработало.   -  person Nick Pickering    schedule 22.03.2013
comment
Не правда. Php.ini имеет этот параметр: session.auto_start = 1   -  person Adam Plocher    schedule 22.03.2013
comment
session_start не отображается в том, что вы разместили. Может быть виновником. Попробуйте with session_start(); посмотреть, что это делает.   -  person Funk Forty Niner    schedule 22.03.2013
comment
session_start(); находится во второй строке кода заголовка, должно быть сверху; и обоих файлов.   -  person Funk Forty Niner    schedule 22.03.2013
comment
gtheader.php вызывается в каждом файле. В том числе gtlogin. Вызов его в login.php вызовет ошибку для двойной сессии.   -  person user2058050    schedule 22.03.2013
comment
И даже в первой строке ничего не меняется. И не должно.   -  person user2058050    schedule 22.03.2013
comment
@user2058050 user2058050 Просто примечание: я заметил, что у вас есть 10 открывающих скобок и 4 закрывающих скобки в вашем Login/Create session variable code:, они переносятся в другой файл или есть что-то, о чем я не знаю (пока)?   -  person Funk Forty Niner    schedule 22.03.2013
comment
Нет, они все закрыты, я просто не стал их публиковать, так как они не влияют на проблему. Обе страницы продолжают работу, но не влияют на сеансы.   -  person user2058050    schedule 22.03.2013
comment
Если вы заметили в верхнем левом углу, когда пользователь не установлен, тест для isset($_SESSION['user']) да, даже после того, как переменная ничего не показывает.   -  person user2058050    schedule 22.03.2013
comment
Вы должны поставить session_start(); перед включенным файлом в header.php. Возможно, в этом файле есть странный символ, из-за которого выходные данные отправляются до session_start(). Иногда это может произойти при загрузке из Windows на сервер Linux. Поскольку вы упомянули, что он отлично работает на локальном хосте   -  person Hanky Panky    schedule 22.03.2013
comment
@HankyPankyㇱ Не проблема. но исправил на всякий случай.   -  person user2058050    schedule 22.03.2013
comment
@user2058050 user2058050 Единственное, что мне приходит на ум, это include_once 'gtfunctions.php'; - я должен сказать, что я не pro, но что, если вместо этого вы попробуете include 'gtfunctions.php';? Я выбираю соломинку здесь, конечно.   -  person Funk Forty Niner    schedule 22.03.2013
comment
gtfunctons не работает с сессиями   -  person user2058050    schedule 22.03.2013


Ответы (3)


Если он работает в одной среде, а не в другой, я предполагаю, что ваш PHP.ini имеет session.auto_start = 1 в среде, которая работает. Лучше всего всегда вызывать session_start() в верхней части страницы и не полагаться на то, что php.ini будет установлен правильно. Это должно заставить его работать в любой среде.

person Adam Plocher    schedule 22.03.2013
comment
session_start был в коде, но не появлялся в тексте. См. верхнюю часть 'header.php' - person user2058050; 22.03.2013

Решено.

Проблема здесь в том, что Host Gator регистрирует глобальные переменные. Итак, поскольку я использую $user и $_SESSION['user'] регистрируется, он перезаписывается.

Я исправил проблему, изменив $_SESSION['user'] во всех файлах на $_SESSION['myUser']

Спасибо за помощь.

person user2058050    schedule 01.04.2013

Необходимо вызвать session_start() вверху страницы

gtheader.php

<?php
    session_start();
    include_once 'gtfunctions.php';
    $loggedIn = FALSE;
    .....
person Sumit Bijvani    schedule 22.03.2013
comment
Исправлено и все еще сломано. Не проблема. - person user2058050; 22.03.2013