Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 会话变量仅在AJAX脚本上消失_Php_Ajax_Session_Mysqli - Fatal编程技术网

Php 会话变量仅在AJAX脚本上消失

Php 会话变量仅在AJAX脚本上消失,php,ajax,session,mysqli,Php,Ajax,Session,Mysqli,我遇到了一个非常奇怪的问题。我最近重写了代码,将其从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

我遇到了一个非常奇怪的问题。我最近重写了代码,将其从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_调用配置文件一次),当我尝试查看会话变量时,它只提供以下信息:

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).....
}

我通过在php.ini中启用输出缓冲解决了这个问题。
然而,我读到这不是一个最佳/推荐的解决方案。然而,我似乎找不到另一种方法来解决这个问题(

终于找到了根本原因。Map_ajax.php是用UTF-8-BOM而不是UTF-8编码的。这个问题已经解决:')

我没有看到任何会话代码。为什么有两个不同的mysql连接API?会话代码写在config.php中-我会在里面编辑它,因为ajax请求没有什么特别之处;您对待它就像对待服务器端的任何其他请求一样。变量/键是否永久删除,或者您是否只在
map\u ajax.php
中看到它们?并在会话函数调用之前清除
@
符号,因为您确实希望看到错误(如果有)…好了,没有会话启动,因为有东西已将输出发送到浏览器。
/home4/emonex3/public\u html/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);