Web表单与会话技术_保存浏览历史

准备测试数据,获取用户当前访问的文章的id,通过Cookie保存浏览历史,显示浏览文章。

1、article.php

<?php
header('Content-Type:text/html; charset=utf-8');
//准备测试数据
$all_data=array(
    //文章id=>array(文章标题、文章内容)
    1=>array('《明天你好》','长大以后,我只能奔跑。我多害怕,黑暗中跌倒。每一次哭,又笑着奔跑。一边失去,一边在寻找。'),
    2=>array('《a little because》','one pain one hope,too far so close, you laugh you cry, you live you grow, because...because...you know, the future is all we have left.'),
    3=>array('《你小行星里的他》','他会是很无趣,在和你平行,做你朦胧光晕,环绕你耳际。他会是很无趣,在和你平行,遨游过的周期,都如数妙计。从决定那刻起,所有轨迹以你为轴心。'),
    4=>array('《Our Love is Funeral》','I do not think your eyes have ever looked surprised. And I do not feel the same each time you call my name. Although our Love is 6 feet underground, it still exists.'),
);
//获取当前文章id
$id=isset($_GET['id'])?intval(($_GET['id'])):1;
//计算上一篇文章的id
$id_last=$id-1;
//计算下一篇文章的id
$id_next=$id+1;
//防止id越界(最低为1,最高为4)
if($id<1) $id=1;
if($id>4) $id=4;
if($id_last<1) $id_last=1;
if($id_next>4) $id_next=4;
/*
 * Cookie是一种“键值对”形式的数据,不同网站设置的Cookie是相互独立的。
 *通过PHP程序,将当前浏览的文章id保存到浏览器的Cookie中。
 * 当网站在浏览器中保存了Cookie时,浏览器每次向服务器请求都会携带Cookie数据,
 * 因此我们可以在PHP中获取来自用户浏览器的Cookie数据,从而实现浏览历史保存功能。
 */
if(isset($_COOKIE['history'])){//判断Cookie中是否存在history记录
    //存在时,通过$cookie_arr接收上次访问过的文章ID
    //$cookie_arr=intval($_COOKIE['history']);

    //由于Cookie只能保存字符串,当要保持多个文章id时,就需要构造一个使用逗号分隔的字符串。为了避免浏览历史的无限增加,还应自动清除较早的浏览历史。
    //获取Cookie,保存到数组中,限制数组最多只能有4个元素。
    $cookie_arr=explode(',',$_COOKIE['history'],4);
    //遍历数组
    foreach($cookie_arr as $k=>$v){
        //将数组中的每个元素转换为整型
        $cookie_arr[$k]=intval($cookie_arr[$k]);
        //如果当前文章id在数组中已存在,则删除
        if($v==$id) unset($cookie_arr[$k]);
    }
    //当数组元素达到4个时,删除第1个元素
    if(count($cookie_arr)>3) array_shift($cookie_arr);
    //将当前访问的文章id添加到数组末尾
    $cookie_arr[]=$id;
    //将数组转换为字符串,重新保存到Cookie中
    setcookie('history',implode(',',$cookie_arr));
}else{
    //不存在时,向COOKIE中保存history记录
    //setcookie('history',$id);//将当前文章id保存到Cookie中

    //通过数组保存浏览历史id
    $cookie_arr=array($id);
    setcookie('history',$id);//将当前文章id保存到Cookie中
}
//$data保存当前页对应的文章数据
$data=$all_data[$id];
//$data_history保存Cookie中的历史记录
$data_history=array();
foreach($cookie_arr as $v){
    if(isset($all_data[$v])){
        //$data_history[文章id]=文章标题
        $data_history[$v]=$all_data[$v][0];
    }
}
//清除历史功能
if(isset($_GET['action'])){
    if($_GET['action']=='clear'){
        $cookie_arr=array();//清除历史记录数组
        setcookie('history','',time()-1);//清除Cookie
    }
}
//加载页面视图文件
require './article_html.php';

2、article_html.php

<html>
<head>
    <meta charset="utf-8">
    <title>浏览记录</title>
</head>
<body>
<div class="content">
    <?php echo $data[0]; ?>   <!--文章标题-->
    <br>
    <?php echo $data[1]; ?>   <!--文章内容-->
</div>
<div class="page">
    <a href="?id=<?php echo $id_last; ?>">上一篇</a>
    <a href="?id=<?php echo $id_next; ?>">下一篇</a>
</div>
<div class="history">
    浏览历史:(<a href="?action=clear">清除历史</a> )
    <ul>
        <?php
        foreach($data_history as $k=>$v){
            echo "<li><a href=\"?id={$k}\">$v</a> </li>";
        }
        ?>
    </ul>
</div>
</body>
</html>

3、知识点

(1)Cookie技术

Cookie是网站为了辨别用户身份而存储在用户本地终端上的数据。

因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么。Cookie就是解决HTTP协议无状态的一种技术。

服务器可以设置或读取Cookie中包含的信息,借此跟踪用户与服务器之间的会话状态。通常应用于浏览历史、保存购物车商品和保存用户登录状态等场景。

在上面的案例中,当用户第一次在网站浏览文章时,服务器在发送网页的同时发送了Cookie,浏览器的Cookie中就记录了那篇文章的id。当用户下次访问时,浏览器会把Cookie发送给服务器,服务器就知道了用户之前访问的是哪一篇文章。服务器可以将每次访问的文章的id追加到Cookie中,浏览器的Cookie就可以保存多个浏览过的文章id。

(2)Cookie的缺点

Cookie被附加在每个HTTP请求中,无形中增加了数据流量。

Cookie在HTTP请求中是明文传输的,所以安全性不高,容易被窃取。

Cookie是来自浏览器中的数据,可以被篡改,因此服务器接收后必须先验证数据的合法性。

浏览器限制Cookie的数量和大小(通常限制为50个,每个不超过4KB),对于复杂的存储需求来说是不够用的。

(3)setcookie();

setcookie('Cookie的名字','Cookie的值','Cookie的有效期');

setcookie('city','北京');   //未指定过期时间,在会话结束时过期

setcookie('city','北京',time()+1800);   //半小时后过期(30分钟=1800秒)

setcookie('city','北京',time()-1);   //立即过期(删除Cookie)

(4)Cookie的读取

通过$_COOKIE数组即可获取Cookie数据。

注意,当PHP第一次通过setcookie()创建Cookie时,$_COOKIE中没有数据,只有当浏览器下次请求并携带Cookie时,才能通过$_COOKIE获取到该数据。

//判断Cookie中是否存在city数据
if(isset($_COOKIE['city'])){
    //存在。从Cookie中获取city数据
    $city=($_COOKIE['city']);
}else{
    //Cookie中的city数据不存在
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值