2012-08-01 55 views
13

PHP会话变量我有一个使用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

当我在新文件中使用session_start()创建一个新的会话。反正有链接这些会话吗? – Quinma 2012-08-01 23:07:49

+0

会话的“链接”是会话cookie,它应该位于HTTP请求的Cookie标头中... – Peter 2012-08-01 23:15:36

+0

您没有使用负载平衡的网络服务器,是吗? (当为PHP会话使用默认的基于文件的后备存储时,主机自然无法共享会话信息) – Peter 2012-08-02 05:25:16

回答

24

我认为你是Ajax调用的页面上缺少session_start()

您需要:

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

这会创建一个新会话,$ _SESSION ['views']对于主页面和子页面而言是不同的数字。 – Quinma 2012-08-01 23:09:59

+0

这是否位于服务器上的其他子域或路径上?如果cookie匹配,它应该使用相同的会话。 – drew010 2012-08-01 23:13:23

+0

我只是从两个文件中运行session_id()并且它是相同的。但它仍然不会拉动变量。 – Quinma 2012-08-01 23:41:14

5

您需要在其他PHP文件启动会话session_start()也,你是通过AJAX调用之一。

1

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

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

您需要在静态路径的地方,你的根文件夹中有。

1

我遇到了什么,我想今天2012的IIS服务器上运行PHP 7时是同样的问题。

我说:

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

每个AJAX文件的开始,但一直recieving以下PHP的通知:

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

搜索导致我这个线程其中指出我的位解决我遇到的问题的正确方向。希望以下信息可以帮助其他人遇到同样的问题。

检查session.save_path的值设置,在我的案例℃之后:\ WINDOWS \ TEMP,我想最好还是检查权限匹配,我被运行IIS的用户帐户的文件夹中。

在我的情况下,事实证明,我为会话存储提名的目录(在php.ini中)没有分配给它的用户(安全权限)与正在运行IIS站点的用户(安全权限)相同。

有趣的是,在添加新用户权限之前,如果不使用AJAX请求,会话工作正常。但是,在更正权限问题之前,AJAX没有选择会话。添加运行IIS的同一用户帐户立即解决了此问题。

0

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

session_start(); 

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

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

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

0

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

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

使得当AJAX调用到PHP需要现有的会话数据的脚本,session_status后使用session_start。

http://php.net/session_status