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