免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3365 | 回复: 10
打印 上一主题 下一主题

请大家帮忙看看我这个函数为什么不正确 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-24 10:29 |只看该作者 |倒序浏览
我想把用户最近浏览的N条记录用数组形式存在COOKIE里,但是下面这代码老是运行不正确,请大家帮忙看看



<?php
session_start();
header('Content-Type: text/html; charset=utf-8');
$historycount = 20; //保存历史记录数量


function browse_history($id)
{
global $historycount;
//判断用户历史记录是否存在

if(!isset($_COOKIE['history']) || !is_array($_COOKIE['history']))
{  
&nbsp;&nbsp;setcookie("history[]",$id);
&nbsp;&nbsp;return;
}

//判断参数$id是否为空或为数字

if(empty($id) || !is_numeric($id)) return;

//如果history记录多于系统允许的值,则删除最后一个

if(count($_COOKIE['history']) >= $historycount)
{
&nbsp;&nbsp;$tmp = array_pop($_COOKIE['history']);
}

//把最新的插在最前面

array_unshift($_COOKIE['history'],$id);
} // function end


/*----------------------下面是测试--------------------------*/
print_r($_COOKIE['history']);
echo '<br /><hr />';
if(isset($_GET['id']))
{
browse_history($_GET['id']);
echo '编号为:'.$_GET['id'].'的浏览记录已经存入cookie<br />';
}

for($i=0;$i<100;$i++)
{
echo "<a href=\"index.php?id=$i\">product $i</a><br>\r\n";
}
?>

论坛徽章:
0
2 [报告]
发表于 2007-08-24 13:12 |只看该作者
那是因为$_COOKIE很特殊,很多数组函数不支持对它操作

论坛徽章:
0
3 [报告]
发表于 2007-08-24 13:23 |只看该作者
谢谢楼上的,那有没有解决的办法呢?或者用其他的?

论坛徽章:
0
4 [报告]
发表于 2007-08-24 13:58 |只看该作者
将数组序列化或者做其他处理后再保存到cookie里!

论坛徽章:
0
5 [报告]
发表于 2007-08-24 14:13 |只看该作者
传说中的序列化,挺好玩的。

  1. <?php
  2. session_start();
  3. header('Content-Type: text/html; charset=utf-8');
  4. $historycount = 20; //保存历史记录数量


  5. function browse_history($id)
  6. {
  7.     global $historycount;
  8.     //判断用户历史记录是否存在
  9.    
  10.     if(!isset($_COOKIE['history']))
  11.     {
  12.         $history = serialize(array($id));
  13.         setcookie("history",$history);
  14.         return;
  15.     }
  16.    
  17.     //判断参数$id是否为空或为数字
  18.    
  19.     if(empty($id) || !is_numeric($id)) return;
  20.    
  21.     //如果history记录多于系统允许的值,则删除最后一个
  22.    
  23.     $history = @unserialize(stripslashes(rawurldecode($_COOKIE['history'])));
  24.    
  25.     if ($history<>false)
  26.     {
  27.         if(count($history) >= $historycount)
  28.         {
  29.             
  30.             $tmp = array_pop($history);
  31.         
  32.         }
  33.         
  34.         //把最新的插在最前面
  35.         
  36.         array_unshift($history,$id);
  37.         
  38.         setcookie("history",serialize($history));
  39.     }
  40.     else
  41.     {
  42.         setcookie("history[]","", time()-60);
  43.         
  44.         if (is_array($_COOKIE['history']))
  45.         {
  46.             foreach ($_COOKIE['history'] as $name => $value)
  47.             {
  48.                 setcookie("history[$name]","", time()-60);
  49.             }
  50.         }
  51.         $history = serialize(array($id));
  52.         setcookie("history",$history);
  53.         
  54.     }

  55. } // function end


  56. /*
  57. ----------------------下面是测试--------------------------
  58. */
  59. print "<pre>";
  60. print "COOKIES: $_SERVER[HTTP_COOKIE]<BR>";
  61. if(isset($_COOKIE['history']))
  62. {
  63.     print_r(unserialize(stripslashes(rawurldecode($_COOKIE['history']))));
  64. }
  65. echo '<br /><hr />';
  66. if(isset($_GET['id']))
  67. {
  68.     browse_history($_GET['id']);
  69.     echo '编号为:'.$_GET['id'].'的浏览记录已经存入cookie<br />';
  70. }

  71. for($i=0;$i<100;$i++)
  72. {
  73.     echo "<a href=\"test.php?id=$i\">product $i</a><br>\r\n";
  74. }
  75. print "</pre>";
  76. ?>

复制代码

论坛徽章:
0
6 [报告]
发表于 2007-08-24 14:44 |只看该作者
谢谢sunnyfun,谢谢楼上几位热心的朋友,感谢CCTV、MTV……
现在测试去

论坛徽章:
0
7 [报告]
发表于 2007-08-24 16:10 |只看该作者
Cannot modify header information - headers already sent by 17


<?php
session_start();
header('Content-Type: text/html; charset=utf-8');
$historycount = 20;&nbsp;&nbsp;&nbsp;&nbsp;//保存历史记录数量


function browse_history($id)
{
&nbsp;&nbsp;&nbsp;&nbsp;global $historycount;

&nbsp;&nbsp;&nbsp;&nbsp;//判断参数$id是否为空或为数字

&nbsp;&nbsp;&nbsp;&nbsp;if(empty($id) || !is_numeric($id)) return;

&nbsp;&nbsp;&nbsp;&nbsp;//判断用户历史记录是否存在

&nbsp;&nbsp;&nbsp;&nbsp;if(!isset($_COOKIE['history']))
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$history = serialize(array($id));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setcookie("history",$history);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;$history = @unserialize(array($_COOKIE['history']));

&nbsp;&nbsp;&nbsp;&nbsp;if($history)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果history记录多于系统允许的值,则删除最后一个

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(count($_COOKIE['history']) >= $historycount)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tmp = array_pop($history);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array_unshift($history,$id);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setcookie("history",serialize($history));&nbsp;&nbsp;&nbsp;&nbsp; //把最新的插在最前面

&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setcookie("history","",time()-60);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_array($_COOKIE['history']))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($_COOKIE['history'] as $name => $value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setcookie("history[$name]","", time()-60);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$history = serialize(array($id));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setcookie("history",$history);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
}&nbsp;&nbsp;&nbsp;&nbsp;// function end



/*----------------------下面是测试--------------------------*/
print_r($_COOKIE['history']);
echo '<br /><hr />';&nbsp;&nbsp;&nbsp;&nbsp;

if(isset($_GET['id']))
{
&nbsp;&nbsp;&nbsp;&nbsp;browse_history($_GET['id']);
&nbsp;&nbsp;&nbsp;&nbsp;echo '编号为:'.$_GET['id'].'的浏览记录已经存入cookie<br />';&nbsp;&nbsp;&nbsp;&nbsp;
}


for($i=0;$i<100;$i++)
{
&nbsp;&nbsp;&nbsp;&nbsp;echo "<a href=\"history.php?id=$i\">product $i</a><br>\r\n";&nbsp;&nbsp;&nbsp;&nbsp;
}
?>

论坛徽章:
0
8 [报告]
发表于 2007-08-24 16:13 |只看该作者
我是用editplus utf-8编写的,可怎么这样呢 :em11:

论坛徽章:
0
9 [报告]
发表于 2007-08-24 16:28 |只看该作者
PHP 和 UTF-8 的 BOM 有冲突,请查看本版或者 Web 版有一个帖子专门讨论了这个问题。

论坛徽章:
0
10 [报告]
发表于 2007-08-24 16:34 |只看该作者
filename: history.php BOM Not Found.

我用了程序检测bom,之前也没有输出什么,整页的代码已经全都在上面了,不知道还应该怎么做了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP