计数器详细设计


Posted in PHP onOctober 09, 2006

概述:
此设计可以在本计数器基础之上设计计数分析程序,可以对页面访问、ip访问次数进行分析,并形成报表。
一、数据库设计
数据库采用mysql
相关文件:    createDatabase.sql        创建数据库
            createTblCounter.sql    创建计数器表

表名:tpCounter(table of pages counter)
字段:
名称    类型    意义
id    Int (10) auto_increment    序列号
pagename    varchar(20)    页面标识,缺省为页面文件名
count    Int(10)    计数值

表名:tiCounter(table of ip counter)
字段:
名称    类型    意义
id    Int(10) auto_increment    序列号
ip    varchar(20)    Ip标识
count    Int(10)    该ip访问次数
date    datetime    最近访问时间
pages    text    曾访问过的页面id,用'|'分隔

二、详细说明:
1、    可以对每个页面进行计数,也可以统计每个ip访问的次数,最近访问时间,以及每次访问的页面,需要两个表;
2、    统计网站访问人次:tpCounter中设置一个站标识[建议用pagename='0'标志];
3、    每次打开页面时都先检查session,若不存在该用户的session,说明是刚刚开始访问本网站,此时创建一个此用户的session,对网站计数增1,对所访问页面计数增1;[打开或刷新页面时]如果该用户session已存在,网站计数值不增加,但是页面计数值每刷新一次都要增1;
4、    关闭页面时,检查该用户打开本网站页面数是否为0,是则销毁该用户的session,否则不销毁;[此功能不需编写程序,服务器自动执行]
5、    在访问时如果页面在tpCounter中没有标识,自动在表中插入一条记录;
6、    pages是一个文本类型,记录了浏览者访问的时间和访问的页面,其中包含类似这样格式的字符串:
||2001-5-1 16:00:00|1|12|5||2001-8-3 10:12:5|4|9|
表示此ip在2001-5-1 16:00:00访问了1、12、5页面,在2001-8-3  10:12:5访问了5、4、9页面[页面的号从上一个表中获得];
7、    设计计数的文件(.php),每一个页面都包含这个文件,这个文件中包含以下的功能:
        1>session检查,
        2>连接数据库,
        3>计数[参数为 页面名称、ip、当前时间],
        4>读写数据库,
        5>断开与数据库的连接;
8、对所访问的页面的记录采用如下方式:
        用户打开一个新的页面时,如果用户session不存在,写入时间并记录当前页面,若存在,写入当前页面。写入采用附加的方式。
9、    网站计数在此头文件中,对页面计数在所计页面中。
10、每一个页面在包含本文件时,如果要对页面计数,一定要在包含之前使用变量$page_name,并赋值为页面的名称,页面名称不能有重复。

三、接口描述:
相关文件:counter.php

1/Boolean check_session()
功能描述:session检查,原来存在返回true;原来不存在返回false,并创建,并注册布尔型变量existing
入口参数:无
    出口参数:布尔型
2/site_count($content)
    功能描述:网站访问计数
    入口参数:数据库连接
    出口参数:计数值

3/page_count($connect,$page_name,$flag=true)
    功能描述:网页计数,返回页面访问次数,整型,$flag是是否增加计数的标志,缺省true
    入口参数:$connect:数据库连接,$page_name:网页名称
    出口参数:页面访问次数

4/show_site_count(int type)
功能描述:显示计数
入口参数:    type==1采用图形计数
type==2采用文本计数

四、流程
    0/检查进入页面的权限
        由于头文件需要通过引用才可以编译,因此必须检查是通过引用还是直接浏览
1/链接数据库
2/检查session,若不存在,创建session,进行网站计数
3/显示计数
4/进行页面计数
5/断开与数据库的连接[自动实现]

五、使用方法
所有的函数都包含在一个头文件中,在使用时,包含此头文件即可。
六、附源程序
<?php
/**    counter.php v1.0
*    by Amio 2001-5-1
*    描述:计数器文件,可以对整个网站计数,
*        可以对所有页面计数,可以对每个ip计数
*/
/**    接口实现功能:
*    1>session 检查
*    2>连接数据库
*    3>计数
*    4>读写数据库
*    5>链接部分的表格输出
*/
/**    使用方法:
*    此文件必须是包含在其他的php文件之中使用,
*    在引用之前需要对$inc变量进行配置
*    e.g.:
*    <?php
*    $inc="inc";
*    include("include.php");  
*     
*    ?>
*/
?>
<?php
//session检查,返回布尔型
//true--此用户session存在
//false--此用户session不存在
function check_session(){
    $existing=true;
    session_start();
    if (!session_is_registered("existing")){
        session_register("existing");
        return false;     
    } else  return true;     
}

//网页计数,返回页面访问次数,整型
//$flag是是否增加计数的标志,缺省true
function page_count($connect,$page_name,$flag=true){
    $ip = getenv("REMOTE_ADDR");
    $query=@mysql_query("select id,count from tpcounter where pagename='$page_name'",$connect) or die("invalid page query!");
    if (!(mysql_num_rows($query))){
        mysql_query("insert into tpcounter (pagename,count) values('$page_name',1)",$connect)or die("insert page failed");
        $pidquery=@mysql_query("select id from tpcounter where pagename='$page_name'",$connect) or die ("select page id failed");
        $pidarray=mysql_fetch_array($pidquery);
        $pid=$pidarray[id];         
        $return_num=1;
    }else {  
        $array=mysql_fetch_array($query);
        $num=$array[count];         
        $pid=$array[id];         
        if ($flag)
            $num++;
        mysql_query("update tpcounter set count=$num where pagename='$page_name'",$connect)or die("update page failed");
        $return_num=$num;
    }     
    $pquery=@mysql_query("select pages from ticounter where ip='$ip'",$connect) or die ("invalid pages query!");
    if (($flag)&&(mysql_num_rows($pquery))){
        $parray=mysql_fetch_array($pquery);
        $ps="$parray[pages]";
        $pstr="$parray[pages]"."$pid"."|";
        mysql_query("update ticounter set pages='$pstr' where ip='$ip'",$connect)or die ("update ip  failed");
    }  
    return $return_num;  
}

//ip计数,返回ip访问次数,整型
//功能除了计数还有时间更新
//$flag是是否增加计数的标志,缺省true
//注意:ip_count的调用必须在page_count之前!!!
function ip_count($connect){

    $ip = getenv("REMOTE_ADDR");

    $visit_time=date("Y:m:d:H:i");
    $visit_pages="||"."$visit_time"."|";
    $ipquery=@mysql_query("select count,pages from ticounter where ip='$ip'",$connect) or die ("invalid ip query!");

    if (!(mysql_num_rows($ipquery))){//新的ip
        $pageStr="|"."$visit_pages";         
        mysql_query("insert into ticounter (ip,count,date,pages) values ('$ip',1,'$visit_time','$pageStr')",$connect)or die("insert ip failed");
        return 1;
    }else{                //旧的ip
        $parray=mysql_fetch_array($ipquery);
        $ipnum=$parray[count];
        $pageStr="$parray[pages]"."$visit_pages";
        $ipnum++;
        mysql_query("update ticounter set count=$ipnum,date='$visit_time',pages='$pageStr' where ip='$ip'",$connect)or die("update ip failed");
        return $ipnum;
    }

}

//网站计数,返回整型,网站访问次数
function site_count($connect){
    if (!check_session()){    //session不存在
        $ipnum=ip_count($connect);
        $num=page_count($connect,"website",true);
    }else{            //session存在
        $num=page_count($connect,"website",false);
    }     
    return $num;     
}

function displayCount($num){
    $fileurl="countpng.php?count=".$num;
    return $fileurl;
}

//显示计数值,type为显示类型,length为显示的长度,缺省6
//type=1图形形式
//type=2文本形式(缺省)
function show_site_count($num,$length=6,$type=2){

    $outStr=strval($num);
    for ($i=strlen($outStr)+1;$i<=$length;$i++){
        $outStr="0"."$outStr";
    }
    switch ($type){
        case 1:
            echo " echo displayCount($outStr);
            echo "\">";
            break;
        case 2:
        default:     
            echo "$outStr";     
    }     
}
?>

<?php
if (!isset($inc))exit;
$connect=mysql_connect('localhost','root','');//connect to server
mysql_select_db("damio",$connect); //select database ,database name is damio

$sitecount=site_count($connect);
if (isset($page_name))
    page_count($connect,$page_name);
?>

PHP 相关文章推荐
php header示例代码(推荐)
Sep 08 PHP
php二维数组排序与默认自然排序的方法介绍
Apr 27 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
Win下如何安装PHP的APC拓展
Aug 07 PHP
删除html标签得到纯文本可处理嵌套的标签
Apr 28 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 PHP
用php来限制每个ip每天浏览页面数量的实现思路
Feb 24 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
thinkphp分页集成实例
Jul 24 PHP
操作Oracle的php类
Oct 09 #PHP
如何利用php+mysql保存和输出文件
Oct 09 #PHP
消息持续发送的完整例子
Oct 09 #PHP
PHP+MYSQL的文章管理系统(一)
Oct 09 #PHP
PHP实现分页的一个示例
Oct 09 #PHP
用cookies来跟踪识别用户
Oct 09 #PHP
使用sockets:从新闻组中获取文章(一)
Oct 09 #PHP
You might like
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
js删除数组中某几项的方法总结
2019/01/16 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
Python中List.count()方法的使用教程
2015/05/20 Python
python Django框架实现自定义表单提交
2016/03/25 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
python画图系列之个性化显示x轴区段文字的实例
2018/12/13 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
Python流程控制 while循环实现解析
2019/09/02 Python
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
优秀中专生推荐信
2013/11/17 职场文书
毕业生个人求职信范文分享
2014/01/05 职场文书
儿子婚宴答谢词
2014/01/09 职场文书
毕业自我鉴定书
2014/03/24 职场文书
战友聚会主持词
2014/04/02 职场文书
工程项目合作意向书
2015/05/08 职场文书
民主生活会意见
2015/06/05 职场文书
导游词之太湖
2019/10/08 职场文书