Переменные сеанса исчезают только в сценарии AJAX - PullRequest
0 голосов
/ 28 ноября 2018

Я столкнулся с действительно странной проблемой.Я недавно переписал код, чтобы обновить его с mySQL до mySQLi.У меня есть файл конфигурации с именем 'config.php', устанавливающий соединение с базой данных как PDO, так и mySQLi следующим образом:

$mysqli = new mysqli("localhost", "XXXX", "XXXX", "XXXXX");
$db = new PDO('mysql:host=localhost;dbname=XXXX;charset=utf8', 'XXXX', 'XXXX');
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Большинство других моих PHP-скриптов будут использовать require_once 'config.php', ина этих страницах я могу просмотреть переменные сеанса, выполнив print_r ($ _ SESSION), который возвращает мне этот массив:

 Array ( [lastseen] => 1543419158 [lang] => en [username] => 1 [userid] => 1 [staff] => [mod] => [catchLegends] => 1 [special] => [dogs] => [trquest] => 1 [gold1] => [gold2] => [gold3] => )

Однако с момента обновления мой файл ajax, который также вызываетФайл конфигурации с помощью require_once, когда я пытаюсь просмотреть переменные сеанса, он только дает мне следующее:

Array ( [lastseen] => 1543419470 [lang] => en )

Я не уверен, что случилось с другими полями массива.У кого-нибудь есть подсказка?

Для справки, этот ajax-файл называется 'map_ajax.php' и вызывается через 'map.php' следующим образом:

$.get('map_ajax.php?map=<?php echo $map; ?>&x='+x+'&y='+y+'&rnd='+z+'', function(result) {
        var res = jQuery.parseJSON(result);
.......(more code).....
}

Буду признателен за любую помощькак я абсолютно новичок в AJAX.

Код сеанса в config.php:

@session_save_path("/tmp");
@session_start();
if (isset($_SESSION['lastseen']) && (time() - $_SESSION['lastseen'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
} else {
    $_SESSION['lastseen'] = time();
}

if (isset($_SESSION['userid'])) {
    $uid = (int) $_SESSION['userid'];
    $user = mysqli_fetch_object($mysqli->query("SELECT * FROM `users` WHERE `id`='{$uid}'"));

    // Check if they are banned
    if ($user->banned == 1 && $filename != 'logout.php') {
        header('Location: logout.php');
        die();
    }

    $time = $_SESSION['lastseen'];  
    $mysqli->query("UPDATE `users` SET `lastseen`='{$time}' WHERE `id`='{$uid}' LIMIT 1");
}
$allowed_lang = array('en', 'es', 'ph', 'lv');

if(isset($_GET['lang']) === true && in_array($_GET['lang'], $allowed_lang) === true) {
    $_SESSION['lang'] = $_GET['lang'];
} else if(isset($_SESSION['lang']) === false){
    $_SESSION['lang'] = 'en';
}

include 'lang/' . $_SESSION['lang'] . '.php';

define('GOT_CONFIG', true);

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Наконец-то найдена основная причина.Map_ajax.php был закодирован в UTF-8-BOM вместо UTF-8.Это было решено: ')

0 голосов
/ 28 ноября 2018

Я справился с этой проблемой, включив буферизацию вывода в php.ini.Тем не менее, я прочитал, что это не оптимальное / рекомендуемое решение.Тем не менее, я не мог найти другой способ решить эту проблему .....: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...