php$\u会话变量不能与jQuery get()一起使用

php$\u会话变量不能与jQuery get()一起使用,php,jquery,session,Php,Jquery,Session,我有一个PHP页面“home.PHP”,开头如下: require_once "data/secure/sessions.php"; session_start(); require "data/secure/dbconn.php"; require "data/get_data.php"; .... <div id="store_items"> <?php echo getStoreItems(); ?> </d

我有一个PHP页面“home.PHP”,开头如下:

require_once "data/secure/sessions.php";
session_start();

require "data/secure/dbconn.php";
require "data/get_data.php";
    ....
    <div id="store_items"> 
            <?php echo getStoreItems(); ?>
    </div>
    ...
<?php
    header("Cache-control: no-store, no-cache, must-revalidate");
    header("Expires: Mon, 26 Jun 1997 05:00:00 GMT");
    header("Pragma: no-cache");
    header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");

    require "secure/dbconn.php";

    $current_store_brand = "";
    $current_store_name = "";
    $items_per_page = 15;
    $item_type = "Groceries";

    ...

    function getStoreItems()
    {
        $current_page = 1;
        $store_data = "";
        $pages_html = "";

    if($GLOBALS['current_store_brand'] != "")
    {
        $conn = mysqli_connect($GLOBALS['host'], $GLOBALS['user'], $GLOBALS['password'], $GLOBALS['database']) or die("Could not connect to database!".mysqli_connect_error());
        ...
        return "No Stores found for ".$_SESSION['location'].", ".$_SESSION['country'].".";
    }
?>
    function getStoreItems()
{
    if(!isSet($_SESSION))
    {
        require "secure/sessions.php";
        session_start();
    }
    ....
我曾尝试在外部文件中包含“sessions.php”文件,但没有成功。我也试过一个if…else。。。语句,如果$\u SESSION变量不可用,则需要sessions.php文件。为什么当我从“home”php页面使用jQuery调用外部文件时,$\u会话全局数组不可访问?jQuery函数的一部分如下所示:

$('#store_items').on("click", ".item > .basket_data > button", function(event)
{
    event.preventDefault();

    ...

    $.get("data/get_data.php", {"basket":"", "username":$username, "item_name":$item_name, "item_qty":$item_qty, "store_brand":$store_brand, "store_name":$store_name}, function($data)
    {
        $('#shopping_cart').html($data);
    }).fail(function(error)
    {
        $('#shopping_cart').html("An error occurred: " + error.status).append(error.responseText);
    });
@斯诺伯恩,谢谢,你的评论让我找到了解决办法。我必须包括这些陈述

    if(!isSet($_SESSION))
{
    require "secure/sessions.php";
    session_start();
}
在函数本身内部,而不是在get_data.php文件开头的外部,因此看起来如下所示:

require_once "data/secure/sessions.php";
session_start();

require "data/secure/dbconn.php";
require "data/get_data.php";
    ....
    <div id="store_items"> 
            <?php echo getStoreItems(); ?>
    </div>
    ...
<?php
    header("Cache-control: no-store, no-cache, must-revalidate");
    header("Expires: Mon, 26 Jun 1997 05:00:00 GMT");
    header("Pragma: no-cache");
    header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");

    require "secure/dbconn.php";

    $current_store_brand = "";
    $current_store_name = "";
    $items_per_page = 15;
    $item_type = "Groceries";

    ...

    function getStoreItems()
    {
        $current_page = 1;
        $store_data = "";
        $pages_html = "";

    if($GLOBALS['current_store_brand'] != "")
    {
        $conn = mysqli_connect($GLOBALS['host'], $GLOBALS['user'], $GLOBALS['password'], $GLOBALS['database']) or die("Could not connect to database!".mysqli_connect_error());
        ...
        return "No Stores found for ".$_SESSION['location'].", ".$_SESSION['country'].".";
    }
?>
    function getStoreItems()
{
    if(!isSet($_SESSION))
    {
        require "secure/sessions.php";
        session_start();
    }
    ....

现在它工作了,谢谢

您需要添加
session_start()
数据/get_data.php中

在你的主页上你有

require_once "data/secure/sessions.php";
session_start();

require "data/secure/dbconn.php";
require "data/get_data.php";
因此,加载时的文件将获取会话数据,因为会话启动位于顶部

现在,当您通过ajax调用该文件时,它只执行
data/get_data.php
,如果session_start(),该文件对session一无所知;未启动

我建议通过考试,把这条线当作

$.get("data/get_data.php", 
{"basket":"", "username":$username, "item_name":$item_name, "item_qty":$item_qty, "store_brand":$store_brand, "store_name":$store_name},

然后在文件
data/get_data.php
的顶部添加以下内容

if(isset($_GET["ajax_reg"]) && trim($_GET["ajax_reg"])== "yes"){
  require_once "data/secure/sessions.php";
  session_start();
}
因此,如果您在主页上包含此文件,则它不会重新启动会话启动,但当您通过ajax get进行调用时,如果它找到参数“ajax\u reg”:“yes”,则它将启动会话

最后,您的文件位于不同的文件夹中,因此需要确保会话cookie保存路径正确

session_set_cookie_params(0, "/");
session_start();

我将会话保存在数据库中,这就是为什么我要包含“sessions.php”文件来控制写入和读取。我刚试过你说的,但还是不行。信不信由你,两天前它运转良好,然后突然停止工作。我尝试过撤销我可能做过的任何事情,但都没有用。是的,它刚刚开始给我错误。如果我可以问一下,在处理会话时,文件夹层次结构是否重要?以前,get_data.php和home.php文件位于同一文件夹级别,现在get_data.php文件位于更深的文件夹中,位于名为“data”的文件夹中。如果将会话数据存储在磁盘中,则会出现问题。我还没有尝试使用DB,所以可能我需要检查手册,以给你一个具体的答案。欢迎您,我将尝试在DB和subdir访问中保存会话,以查看我是否得到,据我所知,我曾经尝试过在REDIS上存储,并为我工作得很好。但是会话总是通过配置文件包含,并且它包含在每个文件中,并且工作正常,我一定会检查它。@maxp检查您的数据库,它还在写新会话吗?那里有什么变化吗?尝试更改会话对象以输出一些读写数据,以确保其正常工作