有一个数据展示列表,通过点击tag来切换不同状态间的数据
+--------+--------+------+------+
| 未审核 | 审核中 | 执行 | 结单 |
+--------+--------+--------+--------+--------+
| Field1 | Field2 | Field3 | Field4 | Field5 |
+--------+--------+--------+--------+--------+
| data11 | data12 | data13 | data14 | data15 |
...
...
...
+--------+--------+--------+--------+--------+类似这样的表格,通过点击上方的tag来切换显示不同数据,为了其中状态、分页、排序都用COOKIE来记录前台JS操作COOKIE写入成功,而且我查看本地COOKIE文件也是正确的
但是,后台PHP读取COOKIE时,有时候成功,有时候失败...
说失败也不正确,而是它老是读取到同一个旧的COOKIE,但实际上COOKIE早就被JS重写了啊...
比如我点击“审核中”status=2,本地COOKIE也成功写入了
但PHP后台获取到的COOKIE数据 status=4
出现这错误时,不管点哪个tag都没用,显示的数据没变,但我后台跟踪数据库查询,确实每次点击tag都会查询一次数据库
但数据库查询中,那个status字段一直是4...
于是跟踪$_COOKIE数组,发现这数组里的数据一直没变,即使前台JS已经改变COOKIE的数据了...
但是.......如果点击任何tag都返回相同数据时(也就是出现上面说的错误时),只要刷新一下页面,表格数据就正确了...但再点任意一个tag,它显示的数据又变成status=4时的数据了...这错误也不是每次都出现...我之前一次遇到是我同时打开2个窗口,然后把2个窗口都关掉再开就正常了,但这次却是无缘无故突然这样,即使把全部窗口都关闭了依然这样...
我调试时是通过http://computername/xxx这样的路径来访问,而不是域名的形式,会跟这有关吗??

解决方案 »

  1.   

    是说和COOKIE中的domain有关??
    但......出现这个错误的几率不高哦...上面说过我有一次打开2个窗口导致过这问题
    但是我想重现的时候,打开N个窗口都没这问题...
      

  2.   

    这种情况有一个比较好的方法来解决,不要使用JS来操作COOKIE,而是使用PHP来操作COOKIE,这样就统一了,可以使用AJAX发送读写COOKIE的请求即可
      

  3.   

    对不起,那么久才又来回帖(CSDN的通知系统是不是出问题了??怎么最近都没通知说有新回复了??)我尝试着让PHP来操作COOKIE
    PHP部分代码ob_start();
    if(isset($_POST['pl'])) {
      $pl = (Array)json_decode($_POST['pl']);
      print_r($pl);
      log_debug("set post pl = ".ob_get_clean());
      foreach($pl as $key => $val) setcookie("pl[".$key."]", $val, time()+31536000);
    } else {
      if(isset($_COOKIE['pl'])) {
        $pl = $_COOKIE['pl'];
        print_r($pl);
        log_debug("no set post but set cookie pl = ".ob_get_clean());
      } else {
        $pl = array(
          "esc" => 1,
          "status" => 5,
          "now" => 1,
          "order" => "bill_date"
        );
        print_r($pl);
        log_debug("not post not cookie pl = ".ob_get_clean());
        foreach($pl as $key => $val) setcookie("pl[".$key."]", $val, time()+31536000);
      }
    }下面则是捕获到的部分日志
    11-01-22 11:08:31 set post pl = Array
    (
        [esc] => 1
        [status] => 3
        [now] => 1
        [order] => bill_date
    )11-01-22 11:08:33 set post pl = Array
    (
        [esc] => 1
        [status] => 9
        [now] => 1
        [order] => bill_date
    )11-01-22 11:09:05 set post pl = Array
    (
        [esc] => 0
        [status] => 9
        [now] => 1
        [order] => in_qty
    )// 注,上面这些操作都是在列表里,然后在这里我双击显示某行的详细信息,页面跳转了
    // 然后我再在跳转后的页面里点击里面的“返回列表”链接
    // 但返回后,COOKIE却变成下面这样了,照理说pl数组的数据应该是和上面一样才对啊11-01-22 11:10:01 no set post but set cookie pl = Array
    (
        [esc] => 1
        [status] => 5
        [now] => 1
        [order] => bill_date
    )
      

  4.   

    我晕...我尝试着把PHP代码修改为如下ob_start();
    if(isset($_POST['pl'])) {
      $pl = (Array)json_decode($_POST['pl']);
      echo "pl = ";
      print_r($pl);
      foreach($pl as $key => $val) {
        if(!setcookie("pl[".$key."]", $val, time()+31536000)) echo "setcookie error.".PHP_EOL;
      }
      echo "cookie = ";
      print_r($_COOKIE['pl']);
      log_debug("set post ".ob_get_clean());
    } else {
      if(isset($_COOKIE['pl'])) {
        $pl = $_COOKIE['pl'];
        print_r($pl);
        log_debug("no set post but set cookie pl = ".ob_get_clean());
      } else {
        $pl = array(
          "esc" => 1,
          "status" => 5,
          "now" => 1,
          "order" => "bill_date"
        );
        print_r($pl);
        log_debug("not post not cookie pl = ".ob_get_clean());
        foreach($pl as $key => $val) setcookie("pl[".$key."]", $val, time()+31536000);
      }
    }
    结果从输出的日志来看,COOKIE写入失败啊...11-01-22 11:23:02 no set post but set cookie pl = Array
    (
        [esc] => 1
        [status] => 5
        [now] => 1
        [order] => bill_date
    )11-01-22 11:23:07 set post pl = Array
    (
        [esc] => 1
        [status] => 8
        [now] => 1
        [order] => bill_date
    )
    cookie = Array
    (
        [esc] => 1
        [status] => 5
        [now] => 1
        [order] => bill_date
    )11-01-22 11:23:14 set post pl = Array
    (
        [esc] => 1
        [status] => 9
        [now] => 1
        [order] => bill_date
    )
    cookie = Array
    (
        [esc] => 1
        [status] => 5
        [now] => 1
        [order] => bill_date
    )但....下面是我机器上的COOKIE信息pl[esc]
    1
    ma2jiajia-pc/pact/index/
    1024
    752418048
    30202037
    3025504144
    30128611
    *
    pl[status]
    9
    ma2jiajia-pc/pact/index/
    1024
    752418048
    30202037
    3025504144
    30128611
    *
    pl[now]
    1
    ma2jiajia-pc/pact/index/
    1024
    752418048
    30202037
    3025504144
    30128611
    *
    pl[order]
    bill_date
    ma2jiajia-pc/pact/index/
    1024
    752418048
    30202037
    3025504144
    30128611
    *
    从COOKIE文件来看,确实是写入成功了啊...为什么PHP获取到的COOKIE就是失败呢??
      

  5.   

    ........还真的是作用域的问题
    后来把所有COOKIE都删除了,经过追踪...发现....path错了...
    我默认没传递path参数,结果...列表操作写入到ma2jiajia-pc/pact/index,而PHP后台里获取到的COOKIE却是ma2jiajia-pc的COOKIE信息...