日期:2014-05-17  浏览次数:20450 次

遇到一个有意思的问题,不知道怎么说,大家进来看下吧
先看代码再说吧:
$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 的内置机制会对将要存入的字符串做些什么东西??


好吧,有些我知道百度,但是我一直没找到好的,所以拿出来跟大家讨论下!高手莫笑~
php json

------解决方案--------------------
你在开玩笑?
至少需要这样
$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 是个什么玩意?
------解决方案--------------------
1. 这个错误是因为你原先的序列化数据被破坏了,怎么被破坏的?参看第二
2. 你开启了自动转义,即魔术引号,在程序开始前,PHP已经自动帮你转义了外部提交数据,即 $_GET, $_POST, $_COOKIE 。所以你会看到莫名其妙多了个 \

你需要关掉魔术引号,修改 php.ini magic_quote_gpc=Off