本帖最后由 wjjxqld 于 2010-01-11 19:06:46 编辑

解决方案 »

  1.   

    有一点不明白,你为嘛要以session_id为key捏~
      

  2.   

    你把session_id打印出来,看是否产生了变化
      

  3.   

    仔细看下手册你就明白了.
    session_id() is used to get or set the session id for the current session. 
    If id is specified, it will replace the current session id. session_id() needs to be called before session_start() for that purpose.
    session_id() returns the session id for the current session or the empty string ("") if there is no current session (no current session id exists). 拿它做键值就相当于玩火.呵呵
      

  4.   


    我刚尝试使用userid作为key,结果。。
    第2次执行的时候,头一次存入的值的丢失了。郁闷了
      

  5.   

    key拿个固定字符串来做,因为$_SESSION是个数组,拿数字做,可能出现未知的错误.
      

  6.   

    使用$_SESSION['shop']来存放,但仍然出现最初的问题!
    第一次,第二次执行正常,但是第三次数据又丢失了
      

  7.   


                    <? 
    $goodsid=1;
    if(isset($goodsid)){
                session_start();
            /*    if(isset($_SESSION['views']))
                     $_SESSION['views']=$_SESSION['views']+1;
                else
                      $_SESSION['views']=1;
                echo "Views=". $_SESSION['views']."<br>";            echo session_id()."<br>";*/
       
            /* 这里输出的居然也是第一次Views =1 ,第二次Views = 2,第三次Views =1, */
                if(isset($_SESSION[session_id()])){
                    //非第一次载入,还需要对是否已存在做判断,有则数量+1;
                    echo "非第一次载入.<br>";
                    $shopObj = array();
                    $shopObj['goodsid'] = $goodsid;
                    $shopObj['goodsname'] = $goodsname;
                    $shopObj['goodsurl'] = $goodsurl;
                    $shopObj['unit'] = $unit;
                    $shopObj['price'] = $price;
                    $shopObj['count'] = 1;                $shopList = $_SESSION[session_id()];
                    $shopList[count($shopList)] = $shopObj;
                    session_unset($_SESSION[session_id()]);
                    $_SESSION[session_id()] = $shopList;
                }else{
                    //未存在,第一次载入
                    echo "第一次载入.<br>";
                    $shopObj = array();
                    $shopList = array();
                    $shopObj['goodsid'] = $goodsid;
                    $shopObj['goodsname'] = $goodsname;
                    $shopObj['goodsurl'] = $goodsurl;
                    $shopObj['unit'] = $unit;
                    $shopObj['price'] = $price;
                    $shopObj['count'] = 1;                $shopList[0] = $shopObj;                //置入session;
                    $_SESSION[session_id()] = $shopList;
                    //include template($mod, 'myshop');
                }
            }
            $shopList = $_SESSION[session_id()];
            echo count($shopList);
            for( $i=0;$i<count($shopList);$i++) 
            {
                echo var_dump($shopList[$i])."<br>";
            }?>
      

  8.   

    运行一下这个的显示结果。我用php4,所以把你的foreach 转换了一下。。
      

  9.   

    用一个不确定的函数前,一定要去看手册。
    The session_unset() function frees all session variables currently registered. session_unset($_SESSION[session_id()]);
    改成
    unset($_SESSION[session_id()]);试试
      

  10.   

    我这里一直就没丢失过。。echo count($shopList); 不停的往上增加
    每次另外 echo $goodsid; 看看。。
      

  11.   

    就是想实现一个类似购物车的功能,如果使用session实现,没法解决出现的问题的话,我会采用cookie或者存在数据库的方式解决
      

  12.   

    ls看了我在13楼的回复了吗?
    session_unset
    (PHP 4, PHP 5)session_unset --  Free all session variables 
    Description
    void session_unset ( void )
    The session_unset() function frees all session variables currently registered. 
      

  13.   

    嗯,搞清楚session file hander的处理机制。session_id()是个随机加密的字符串,在session_start()执行时,服务器端检测客户端浏览器发送过来的session_id是否对应有服务器session文件,有就使用这个session文件,否则重新生成新的session_id串,服务器利用这个串生成个新的session文件,session文件里的内容是相应session数组的序列化串,你设置$_SESSION["key"]=1,实际上在相应session文件中多了一个相当于key:1这样的东西。
    你不能用session_unset("key")去unset这个key,session_unset不是这么用的,手册表明session_unset( void ),即这个函数调用是不带参数的,将把对应的session文件的所有变量unset掉,而不是单单一个session变量。
      

  14.   


    谢谢,我是做java开发的,这是这个项目正好需要用php,只能硬着头上马了。目前检查下来问题可能出现在
    if($_REQUEST)
    {
    if(MAGIC_QUOTES_GPC)
    {
    $_REQUEST = new_stripslashes($_REQUEST);
    if($_COOKIE) $_COOKIE = new_stripslashes($_COOKIE);
    }
    else
    {
    $_POST = new_addslashes($_POST);
    $_GET = new_addslashes($_GET);
    $_COOKIE = new_addslashes($_COOKIE);
    @extract($_POST);
    @extract($_GET);
    @extract($_COOKIE);
    }
    if(!defined('IN_ADMIN')) $_REQUEST = filter_xss($_REQUEST, ALLOWED_HTMLTAGS);
    extract($db->escape($_REQUEST), EXTR_SKIP);
    if($_COOKIE) $db->escape($_COOKIE);
    }
    if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar))
    {
    parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));
    }
      

  15.   

    这几行代码是过滤用户提交数据,防止注入,这个貌似不会造成你在主贴遇到的问题。
    建议你把session相关代码改了之后,把浏览器的cookies清掉,再来测试你的页面。
      

  16.   

    session_unset($_SESSION[session_id()]); //这行, 你把它毁掉了一般情况下不应该用session_id()作为数组keysession_id()一般放在开头 作为判断是否已经打开了sessionif( session_id() == '' ){
        session_start();
    }
      

  17.   

    补充一下上楼: session_unset($_SESSION[session_id()]);  //把这行删掉, 再把session的key换成其它值, 测试一下应该没问题了, 
      

  18.   


    // 接收的商品信息
    $goodsid = 3;
    $goodsname = "test2";
    $goodsurl = "http://www.test.com";
    $unit = "test";
    $price = "1";
    $count = 1;session_start();
    if(isset($goodsid))
    {
    // 输出view
    if(isset($_SESSION['views']))
    {
     $_SESSION['views']=$_SESSION['views']+1;
    }
    else
    {
      $_SESSION['views']=1;
    } echo "Views=" . $_SESSION['views'] . "<br>"; // 购物车内商品个数
    $size = isset($_SESSION["shopList"]) ? count($_SESSION["shopList"]) : 0; // 判断是否商品已存在,存在则只更新数量
    if($size > 0 && $_SESSION["shopList"][$size-1]['goodsid'] == $goodsid)
    {
    $_SESSION["shopList"][$size-1]['count'] += $count;
    }
    else
    {
    $shopList = array();
    $shopList['goodsid'] = $goodsid;
    $shopList['goodsname'] = $goodsname;
    $shopList['goodsurl'] = $goodsurl;
    $shopList['unit'] = $unit;
    $shopList['price'] = $price;
    $shopList['count'] = $count;

    $_SESSION["shopList"][] = $shopList;
    }
    }// 判断购物是否为空
    if(isset($_SESSION["shopList"]))
    {
    foreach ( $_SESSION["shopList"] as $key => $value ) 
    {
    echo $value['goodsname'] . "<br>";
    }
    }
      

  19.   

    void session_unset ( void )你 session_unset($_SESSION[session_id()]);//有没有参数都一样
    这样就把全部 session 数据都删除了
      

  20.   


    我看他就是因为这行把之前所有的session毁掉了, 所以下面没效果, 
      

  21.   

    session_unset($_SESSION[session_id()]); //这行多余
    $_SESSION[session_id()] = $shopList;    //关键就在这行