计数器详细设计


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 相关文章推荐
LotusPhp笔记之:Cookie组件的使用详解
May 06 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 PHP
php中的路径问题与set_include_path使用介绍
Feb 11 PHP
php微信公众开发之获取周边酒店信息的方法
Dec 22 PHP
php使用sql server验证连接数据库的方法
Dec 25 PHP
PHP中使用Imagick操作PSD文件实例
Jan 26 PHP
PHP中遇到的时区问题解决方法
Jul 23 PHP
symfony2.4的twig中date用法分析
Mar 18 PHP
php生成图片验证码的方法
Apr 15 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
对php 判断http还是https,以及获得当前url的方法详解
Jan 15 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
PHP 存储文本换行实现方法
2010/01/05 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
php三元运算符知识汇总
2015/07/02 PHP
PHP与以太坊交互详解
2018/08/24 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
jquery插件hiAlert实现网页对话框美化
2015/05/03 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
python getopt 参数处理小示例
2009/06/09 Python
EM算法的python实现的方法步骤
2018/01/02 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
我就是这样学习Python中的列表
2019/06/02 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
如何通过python实现全排列
2020/02/11 Python
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
幼儿园开学家长寄语
2014/01/19 职场文书
行政办公室岗位职责
2014/03/18 职场文书
求职简历自我评价范文
2015/03/10 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
培根随笔读书笔记
2015/07/01 职场文书
python - asyncio异步编程
2021/04/06 Python
晶体管来复再生式二管收音机
2021/04/22 无线电
深入理解 Golang 的字符串
2022/05/04 Golang