PHP会话变量未使用ajax保留

时间:2012-08-01 23:03:01

标签: php ajax session-variables

我有一个单页网站,它使用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路径。对于大多数付费虚拟主机服务,他们只有一个会话的默认容器,但它受负载平衡的影响。真是个好消息。

6 个答案:

答案 0 :(得分:25)

我认为您在Ajax调用的页面上缺少session_start()

你需要:

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

答案 1 :(得分:6)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

今天在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的同一用户帐户可立即解决此问题。

答案 4 :(得分:0)

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

session_start();

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

这样就可以创建SESSIONID并存储浏览器cookie。并且在ajax调用期间发送请求标头,如果您对同一域执行ajax请求

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

答案 5 :(得分:0)

您正在尝试在ajax调用中使用应用程序中的现有会话数据。要做到这一点,请改变你如何调用session_start的方式:

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

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

http://php.net/session_status