先看代码再说吧:
$catid = $_GET['id'];
if( !isset( $_COOKIE[ $cookie_name ] ) ){
$cart_ary = array();
$cart_ary['cart'] = array();
$cart_ary['item_num'] = 0;
$cart_ary['total_price'] = 0.00;
setcookie( $cookie_name,json_encode( $cart_ary ),time()+(7*24*60*60) );
}
//第一次获取不到值,所以需要抑制第一次报错
$cart_ary = json_decode( str_replace( "\\","",@$_COOKIE[ $cookie_name ] ),true );
if( isset( $cart_ary['cart'][ $catid ] ) ){
$cart_ary['cart'][ $catid ]++ ;
}else{
$cart_ary['cart'][ $catid ] = 1;
}
$cart_ary['item_num'] = count_cart_item_num( $cart_ary['cart'] );
$cart_ary['total_price'] = count_cart_total_price( $cart_ary['cart'] );
setcookie( $cookie_name,json_encode( $cart_ary ),time()+(7*24*60*60) );具体问题是这么地:
因为 $cart_ary 是个二维数组,所以当我往 cookie 里面存的时候需要先序列化一下,开始时用 serialize() 和 unserialize() 这两个函数来的,但是不知道怎么回事在 反序列化 的时候报错了“offset xxx” 这种错误,后来百度了一下说是编码问题,但是我这是在同一个页面里面啊,而且都是是UTF-8码,所以这个问题个人觉得不是,那么第一问:大家怎么能看这个问题??然后就是后来我改用了 json_encode() 和 json_decode() 这个两个函数,但是同时有发现了一个问题就是在编码之后往 cookie 里面存的时候 cookie 的内置机制应该是对序列化的数据做了转义了,就是在双引号前面加了反斜杠“\”,所以我不得不去掉它,就像这样;str_replace( "\\","",@$_COOKIE[ $cookie_name ] )然后第二问就是:
我上面说 cookie 的内置机制会对将要存入的字符串做些什么东西??
好吧,有些我知道百度,但是我一直没找到好的,所以拿出来跟大家讨论下!高手莫笑~phpjson

解决方案 »

  1.   

    你在开玩笑?
    至少需要这样
    $catid = $_GET['id'];
    if( !isset( $_COOKIE[ $cookie_name ] ) ){
      $cart_ary = array();
      $cart_ary['cart'] = array();
      $cart_ary['item_num'] = 0;
      $cart_ary['total_price'] = 0.00;
      setcookie( $cookie_name,json_encode( $cart_ary ),time()+(7*24*60*60) );
    }else {
      $cart_ary = json_decode( str_replace( "\\","",@$_COOKIE[ $cookie_name ] ),true );
      if( isset( $cart_ary['cart'][ $catid ] ) ){
        $cart_ary['cart'][ $catid ]++ ;
      }else{
        $cart_ary['cart'][ $catid ] = 1;
      }
      $cart_ary['item_num'] = count_cart_item_num( $cart_ary['cart'] );
      $cart_ary['total_price'] = count_cart_total_price( $cart_ary['cart'] );
      setcookie( $cookie_name,json_encode( $cart_ary ),time()+(7*24*60*60) );
    }又:count_cart_item_num 是个什么玩意?
      

  2.   

    1. 这个错误是因为你原先的序列化数据被破坏了,怎么被破坏的?参看第二
    2. 你开启了自动转义,即魔术引号,在程序开始前,PHP已经自动帮你转义了外部提交数据,即 $_GET, $_POST, $_COOKIE 。所以你会看到莫名其妙多了个 \你需要关掉魔术引号,修改 php.ini magic_quote_gpc=Off
      

  3.   


    额,版主,我那个代码截取一部分看的,整个儿你要相信我是没问题的!O(∩_∩)O哈哈~count_cart_item_num() 这个东西是我自定义的一个函数,用来求商品数量的,当然你可以想到 count_cart_total_price() 这个就是用来求商品总价的了!好吧,版主回答我问题咯先 
      

  4.   


    ( ⊙o⊙ )哇  这个问题不是你说我还真的没想到,好吧 我懂了,真心谢谢了O(∩_∩)O哈!