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

时间:2014-08-15 16:33:11

标签: php ajax session session-variables

我有以下PHP代码,它计算对页面的每次访问。如果我直接打电话给对方,那就很重要。如果我进行Ajax调用,它将始终以1开始。

<?php
session_start();    
header('Access-Control-Allow-Origin: *');

        if (!isset($_SESSION['zaehler'])) {
          $_SESSION['zaehler'] = 1;
        } else {
          $_SESSION['zaehler']++;
        }
echo  $_SESSION['zaehler'];


?>

我知道ajax调用与直接调用相同,只需阅读:Do AJAX requests retain PHP Session info? 只要侧面打开,我如何计算每个ajaxCall?

我正在做一个简单的jquery ajaxCall:

    $.get( "http://www.huntinggrounds.de/aa.php", function( data ) {
         console.log( "dataResponse: ", data );
    }) .fail(function(jqXHR, textStatus ) {
        console.log( "error",textStatus);
       })
       .always(function() {
        console.log( "finished" );
       });

我制作了测试文件testfile.html,只是一个黑屏。单击桌面并在控制台中查看php文件为here的计数器。

3 个答案:

答案 0 :(得分:5)

在测试您的网页后,您的问题与您的网域有关。

http://www.huntinggrounds.de/aa.html工作正常,而不是http://huntinggrounds.de/aa.html

出于安全原因,Cookie是针对每个域的。由http://huntinggrounds.de/aa.html上的PHP设置的Cookie将无法在http://www.huntinggrounds.de/aa.html上运行,具体取决于您的配置。

要通过此问题,请勿在您的ajax中设置完整的网址。优先级相对URI。

$.get( "/collect?"+setParameter(defs),
 function( data ) {
      try {
             console.log("New count is : ",data);
          } catch(e) {
             // if there is no response
             console.log( "No answer : ", data);
         }
  }) 

答案 1 :(得分:0)

我看到你把它放在评论中。

  

你是对的似乎工作。但是在未来的使用中,我正在呼唤   来自不同页面的文件。我将存储用户执行频率的频率   数据库中的ajax调用。这意味着我不能做那个服务器端?

我对你的问题的疑问是为什么甚至打扰会话,只是将它一直存储在数据库中。我发布这个作为答案的原因是因为如果他们关闭浏览器会发生什么?在将其保存到数据库之前。

当然,您仍然希望让会话正常运行。因为在服务器端,您可能希望从中提取用户ID或其他信息。

解释会话问题: 我的钱是在域路径(www.sub-domain -vs- no sub-domain)上,其他人已经提到过你为什么遇到会话cookie的问题。你失去会话并不是真的。但最有可能的是,如果您要查看存储在浏览器中的cookie,您可能会有2个。这意味着您使用一个会话用于www。子域和一个没有域的站点。

您可以随时强制使用www。在您的网站上也有一些.htaccess规则。 .htaccess - how to force "www." in a generic way?

无论如何,下面的具体细节取决于您的确切实施,这就是我不发布代码的原因。 在服务器端。

  1. 在会话中验证使用,或者您可以在此处执行IP地址等...

  2. 将用户ID用于数据库中的唯一字段,或用户ID以及其他某些字段(如访问过的日期或网址)。

  3. 有一个数字字段&#39; views&#39;或者这样的。并且,他们正在访问的网址可能是一个字段?

  4. 每个ajax请求上的
  5. 将用户记录拉出数据库,增加视图字段并保存您想要的任何其他数据。

  6. 数据库查询将超级快速,只需拉出一行,每行都有一个好的数字索引,如用户ID等。

    简而言之,我只是跳过会话位中的整个保存,因为正如我暗示他们关闭浏览器会丢失你的计数。此外,您如何知道何时将其保存在数据库中?除了使用像ajax调用这样的心跳之外,没有办法在断开连接时告诉服务器端。你不能依赖它们正确注销。

    我已经实施了一个类似的系统,以跟踪我们在工作中使用的一些外部承包商进行数据输入的时间。

    在这种植入中,我使用他们正在编辑的记录的id,以及他们的用户ID作为键,然后我有一个时间戳用于上次查看的时间,这样当ajax调用命中时,我拉出最后一次查看的时间(如果它不到几分钟的时间)在一个单独的领域我保持工作的总时间。然后通过一些基本的数学运算,我可以将新的经过的秒数添加到总数和哇拉,我可以保持一个相当准确的跟踪记录打开的时间。

答案 2 :(得分:0)

正如之前的回答所示,当您尝试从没有域cookie的第二个域访问一个域cookie时,您的问题就会发生。

两个域都服务于页面存在一个底层问题,这是搜索引擎上的内容重复惩罚,因为www和非www访问计数为两个站点。

您可以通过仅使用一个网址作为规范网址并重定向另一个网址来解决这两个问题。这可以通过.htaccess完成,或者如果您在配置文件中没有这种服务器访问权限(在每个页面的开头加载),请使用以下代码:

if ('www.' != substr($_SERVER['SERVER_NAME'], 0, 4)) {
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: http://www.'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);
    exit();
}
相关问题