14

我有一个使用 AJAX 加载新 php 文件并更新显示的单页网站。

我在主页上启动我的 php 会话,但是当我使用 ajax 更新内部 html 时,我需要这些会话变量来加载新的 php 文件。

这篇文章与这篇文章类似:PHP Session Variables Not Preserved。但我检查了一下,我的 php.ini 有session.use_cookies = 1

主页 PHP:

<?php 
session_start();
if(isset($_SESSION['views']))
{$_SESSION['views']=$_SESSION['views']+1;}
else
{$_SESSION['views']=1;}
?>

用户输入后,我使用 ajax 调用 php 文件并加载页面的一个子部分:

<?php    
if(isset($_SESSION['views']))
    { echo "Views: " . $_SESSION['views'];} 
    else 
    { echo "Views: NOT SET";}
?>

有人可以告诉我我错过了什么重要的步骤吗?谢谢你。

更新:将 session_id() 调用添加到主页面和子页面后,我看到两个页面都具有相同的 Session_ID。但是,它仍然无法提取会话变量,如果我确实为它分配了一个值,那么两个同名的会话变量将保持相互独立。

回答这个问题产生的问题: 我发现我必须在我的 php.ini 文件中设置一个静态 session_save 路径。对于大多数付费虚拟主机服务,它们只有一个默认的会话容器,但它会受到负载平衡的影响。多么放松。

4

6 回答 6

27

我认为您在session_start()Ajax 调用的页面上丢失了。

你需要:

<?php
session_start();
if(isset($_SESSION['views']))
    { echo "Views: " . $_SESSION['views'];} 
    else 
    { echo "Views: NOT SET";}
?>
于 2012-08-01T23:06:18.763 回答
6

您还需要session_start()在另一个 PHP 文件中启动会话,即您通过 AJAX 调用的那个。

于 2012-08-01T23:06:58.303 回答
2

我今天在 IIS Server 2012 上运行 PHP 7 时遇到了我认为相同的问题。

我补充说:

if(!isset($_SESSION)) 
{ 
    session_start(); 
} 

到每个 AJAX 文件的开头,但不断收到以下 PHP 通知:

PHP Notice: A session had already been started - ignoring session_start()

一些搜索使我找到了这个线程,它为我指出了解决我遇到的问题的正确方向。希望以下信息将帮助其他遇到相同问题的人。

在检查 session.save_path 值设置后,在我的情况下是 C:\Windows\Temp,我认为最好检查文件夹权限是否与我运行 IIS 的用户帐户的权限相匹配。

在我的例子中,我为会话存储指定的目录(在 php.ini 中)没有分配给它与运行 IIS 站点的用户(安全权限)相同的用户(安全权限)。

有趣的是,在我添加新用户权限之前不使用 AJAX 请求时会话工作正常。但是,直到我纠正了权限问题,AJAX 才开始进行会话。添加运行 IIS 的同一用户帐户可立即解决此问题。

于 2016-06-05T23:14:31.970 回答
1

在使用付费网络托管服务的情况下,默认会话保存路径会自动设置如下:

http://php.net/session.save-path
session.save_path = "/tmp/"

您需要将根文件夹的静态路径放在那里。

于 2012-08-02T17:13:59.330 回答
0

在尝试通过 ajax 调用登录之前需要初始化会话。

session_start();

在您开始登录 ajax 调用的页面顶部进行初始化。

这样 SESSIONID 将被创建并存储在浏览器 cookie 中。并在 ajax 调用期间与请求标头一起发送,如果您对同一域执行 ajax 请求

对于连续的 ajax 调用,浏览器将使用最初创建并存储在浏览器 cookie 中的 SESSIONID,除非我们清除浏览器 cookie 或注销(或设置另一个 cookie)

于 2017-05-27T06:03:00.677 回答
0

您正在尝试在 ajax 调用中使用应用程序中的现有会话数据。为此,请更改您调用 session_start 的方式,如下所示:

// With ajax calls
if (session_status()==1) {
    session_start(); 
}

在对需要现有会话数据的 php 脚本进行 ajax 调用时,请在 session_status 之后使用 session_start。

http://php.net/session_status

于 2017-06-01T21:58:05.730 回答