很诡异的session丢失

wjjxqld 2010-01-11 07:05:32
小弟想做一个类似于购物车的功能,目前遇到了一个问题:

第一次通过页面点击后,将物品资料放入session中,以session_id为key!ok,这是正常的。
第二次点击后,在放入session,OK!也没问题!
接着问题就出现,当第三次执行的时候,使用isset($_SESSION[session_id()]))居然读不到数据了!
附上源码,请高手指点!


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()];
foreach ( $shopList as $key => $value ) {
echo $value['goodsname']."<br>";
}




输出结果:
第一次 :
第一次载入.
商品1

第二次:
非第一次载入.
商品1
商品2

第三次:
第一次载入.
商品1

第四次:
非第一次载入.
商品1
商品2

第五次:
第一次载入.
商品1

这是在是郁闷了,望高人指点
...全文
273 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
骄傲青蛙 2010-01-12
  • 打赏
  • 举报
回复
补充一下上楼:

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

骄傲青蛙 2010-01-12
  • 打赏
  • 举报
回复


session_unset($_SESSION[session_id()]); //这行, 你把它毁掉了

一般情况下不应该用session_id()作为数组key

session_id()一般放在开头 作为判断是否已经打开了session

if( session_id() == '' ){
session_start();
}
foolbirdflyfirst 2010-01-12
  • 打赏
  • 举报
回复
这几行代码是过滤用户提交数据,防止注入,这个貌似不会造成你在主贴遇到的问题。
建议你把session相关代码改了之后,把浏览器的cookies清掉,再来测试你的页面。
wjjxqld 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 foolbirdflyfirst 的回复:]
嗯,搞清楚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变量。
[/Quote]

谢谢,我是做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]));
}



foolbirdflyfirst 2010-01-12
  • 打赏
  • 举报
回复
嗯,搞清楚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变量。
wjjxqld 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 foolbirdflyfirst 的回复:]
ls看了我在13楼的回复了吗?
PHP codesession_unset
(PHP4, PHP5)session_unset-- Free all session variables
Description
voidsession_unset ( void )


Thesession_unset()function frees all session variables currently registered.

[/Quote]

尝试过了!我想可能是其实相关代码的问题,我刚建了一个新的页面,测试结果是成功!目前我正在排查代码
foolbirdflyfirst 2010-01-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.

wjjxqld 2010-01-12
  • 打赏
  • 举报
回复
就是想实现一个类似购物车的功能,如果使用session实现,没法解决出现的问题的话,我会采用cookie或者存在数据库的方式解决
jaxio 2010-01-12
  • 打赏
  • 举报
回复
是。。其实你也可以把你想实现的结果说明一下,估计可以找另一种解决方案出来
wjjxqld 2010-01-12
  • 打赏
  • 举报
回复
可能是其他相关代码的问题!我检查一下
jaxio 2010-01-12
  • 打赏
  • 举报
回复
我这里一直就没丢失过。。echo count($shopList); 不停的往上增加


每次另外 echo $goodsid; 看看。。
foolbirdflyfirst 2010-01-12
  • 打赏
  • 举报
回复
用一个不确定的函数前,一定要去看手册。
The session_unset() function frees all session variables currently registered.

session_unset($_SESSION[session_id()]);
改成
unset($_SESSION[session_id()]);试试
wjjxqld 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jaxio 的回复:]
运行一下这个的显示结果。

我用php4,所以把你的foreach 转换了一下。。
[/Quote]
结果仍是一样的,第三次数据丢失
jaxio 2010-01-12
  • 打赏
  • 举报
回复
运行一下这个的显示结果。

我用php4,所以把你的foreach 转换了一下。。
jaxio 2010-01-12
  • 打赏
  • 举报
回复

<?
$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>";
}

?>
wjjxqld 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jakey9826 的回复:]
key拿个固定字符串来做,因为$_SESSION是个数组,拿数字做,可能出现未知的错误.

[/Quote]
使用$_SESSION['shop']来存放,但仍然出现最初的问题!
第一次,第二次执行正常,但是第三次数据又丢失了
程序猿之殇 2010-01-12
  • 打赏
  • 举报
回复
key拿个固定字符串来做,因为$_SESSION是个数组,拿数字做,可能出现未知的错误.
wjjxqld 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jakey9826 的回复:]
仔细看下手册你就明白了.
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).

拿它做键值就相当于玩火.呵呵


[/Quote]

我刚尝试使用userid作为key,结果。。
第2次执行的时候,头一次存入的值的丢失了。郁闷了
程序猿之殇 2010-01-12
  • 打赏
  • 举报
回复
仔细看下手册你就明白了.
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).

拿它做键值就相当于玩火.呵呵

wjjxqld 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 microwindlab 的回复:]
有一点不明白,你为嘛要以session_id为key捏~
[/Quote]

你有更好的建议吗?一起讨论一下
加载更多回复(8)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧