ajax请求后php会话值被擦除

Posted

技术标签:

【中文标题】ajax请求后php会话值被擦除【英文标题】:php sessions value get wiped after ajax request 【发布时间】:2011-10-10 23:35:05 【问题描述】:

我有一个脚本,可以在用户登录时设置我的 uid 和电子邮件会话。

在 2 个变量中:

$_SESSION["uid"] = $user_id;//1,2,3 etc..
$_SESSION["email"] = 'my@email.com';

我有一个功能,用户可以通过 ajax 发布一些数据。 但是当数据发送到服务器并且请求完成时,我的电子邮件会话的值会被擦除,这会导致我的用户无法执行某些操作。

我搜索了整个脚本,但找不到任何内容

$_SESSION["email"] = '';

在 ajax 请求完成后或其他任何可能的地方。

有什么线索吗?

编辑: _SESSION 的 var_dump:

array(2)  ["email"]=> &string(0) "" ["uid"]=> &string(11) "91283921834" 

解决方案: 我的主机显示 5.2.17 作为默认 php 版本,所以我不得不调用

AddType application/x-httpd-php53 .php

在我的 .htaccess 文件中,使其将 5.3.5 视为实时 php 版本,该版本删除了引用,现在可以正常工作了。

【问题讨论】:

它似乎没有被擦除,这很奇怪 所以通过 AJAX 调用开始会话,而电子邮件是唯一不可用的值吗?使用未设置电子邮件的 _SESSION 的 var_dump 更新您的问题。 是的,我已经编辑了问题。 希望我能提供更多帮助,但我需要查看更多代码才能尝试调试它。 T9b 的 SO 问题可能值得一试。 奇怪的是它只发生在实时服务器上而不是本地主机上。 【参考方案1】:

您在某处通过引用会话来分配变量,您可以在 var_dump 中使用 & 字符看到这一点:

array(2)  ["email"]=> &string(0) "" ["uid"]=> &string(11) "91283921834" 
#                     ^^^                     ^^^

PHP 中的引用意味着,在您的情况下,$_SESSION['email'] 已成为其他变量的别名。如果那个 other 变量改变了,$_SESSION['email'] 也会改变,因为它只是一个别名。

因此,您不仅需要查看更改 $_SESSION['email'] 的代码,更重要的是查看哪些部分使其成为别名,以及别名在何处发生更改。

这只是一个猜测,但请搜索 &$email 或只是 $email。查找通过引用接受参数 (&$parameter)、通过引用返回或通过引用使用参数调用的函数。

【讨论】:

我搜索了所有函数和 $_SESSION["email"] 变量或任何相关内容,但在变量或函数参数中找不到任何“&”。由于我的本地主机是 5.3.5,它可能是 5.2.17 的服务器 php 版本吗? @fxuser:服务器和本地主机之间 PHP 版本的差异是我在回答中概述的标志。但是,根据我的建议,这并不意味着它实际上会帮助您找到根本原因。还要寻找动态函数调用(函数名称是动态构建的和/或函数调用是使用 call_user_func* 进行的。另外搜索 any &。修复此问题可能并非易事不过。 如果这是治愈,为什么不;)。并且随着引用的消失,表明代码中的缺陷不再被触发。如果提示有帮助,请随时接受答案。【参考方案2】:

您必须在每个脚本的顶部调用 session_start() 才能实际创建会话

将它放在<?php 标记之后

【讨论】:

我确实包含了我的 config.php,它有我的会话开始和数据库连接【参考方案3】:

当我第一次开始使用 php 会话时,这种事情让我发疯了,直到我掌握了它们。

您应该注意几件事,主要是您的会话 cookie 是关键,因为它会持续存在,只要您愿意。

即使您启动会话并且会话 cookie 设置在一个页面上,您发送到浏览器的每个新页面仍应检查是否已设置会话。

正如您提到的,您使用 ajax 我假设一个页面(例如表单)通过 ajax 进行处理,并且响应返回到同一页面或重定向。你在哪里设置会话?它是在 Ajax 处理脚本中 - 还是在原始表单页面中?

如果您在成功的 AJAX 调用后重定向,请考虑当您的用户点击“返回”时会发生什么。您希望显示相同的数据还是需要重新焕然一新的表单?

如果没有更多信息,我无法给你一个具体的答案,但我有一个有趣的问题可能会有所帮助。

MY SO Question on sesssions

【讨论】:

你的意思是我在哪里设置会话?会话是在用户登录时设置的。我的表单是一个commnent表单,所以用户添加文本,点击提交,然后通过ajax表单处理它一个php页面并发回json数据。我不重定向,只是发回评论文本。当我提交表单并刷新页面时,我的会话已被清除。 尝试在每个页面上回显会话 ID。您很快就会看到会话 ID 是否在整个页面或更改中保持不变。如果它发生变化,那么您将丢失会话变量。还可以尝试通过在代码ini_set('session.cookie_domain','.yourdomain.com'); 中显式设置来强制您的 php ini 从您的域创建会话

以上是关于ajax请求后php会话值被擦除的主要内容,如果未能解决你的问题,请参考以下文章

Internet Explorer 8 不会为 ajax 请求传递会话 cookie

MVC 身份验证超时/会话 cookie 删除后的 Ajax 请求

会话不适用于 ajaxRequest [如何使用会话变量计算 ajax 请求]

如何处理 AJAX 请求中的会话超时

Ajax请求如何保持同一会话session

ajax 请求是不是会导致更新 asp.net 会话?