当前位置: 首页 > 图文教程 > 网络编程 > PHP > 计数器详细设计

PHP
PHP 执行系统外部命令 system() exec() passthru()
最新的php 文件上传模型,支持多文件上传
php 静态页面中显示动态内容
数据库查询记录php 多行多列显示
谈PHP生成静态页面分析 模板+缓存+写文件
PHP 各种排序算法实现代码
PHP nl2br函数 将换行字符转成 <br>
php 分页原理详解
Discuz 模板语句分析及知识技巧
php win下Socket方式发邮件类
怎样去阅读一份php源代码
建站常用13种PHP开源CMS比较
php xml留言板 xml存储数据的简单例子
PHP 开源AJAX框架14种
PHP 替换模板变量实现步骤
PHP has encountered an Access Violation at 7C94BD02解决方法
php 正则匹配函数体
php 文件夹删除、php清除缓存程序
php download.php实现代码 跳转到下载文件(response.redirect)
PHP类(Class)入门教程

PHP 中的 计数器详细设计


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 217 ::
收藏到网摘: n/a

概述:
此设计可以在本计数器基础之上设计计数分析程序,可以对页面访问、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/断开与数据库的连接[自动实现]
五、使用方法
所有的函数都包含在一个头文件中,在使用时,包含此头文件即可。
六、附源程序
/** counter.php v1.0
* by Amio 2001-5-1
* 描述:计数器文件,可以对整个网站计数,
* 可以对所有页面计数,可以对每个ip计数
*/
/** 接口实现功能:
* 1>session 检查
* 2>连接数据库
* 3>计数
* 4>读写数据库
* 5>链接部分的表格输出
*/
/** 使用方法:
* 此文件必须是包含在其他的php文件之中使用,
* 在引用之前需要对$inc变量进行配置
* e.g.:
* * $inc="inc";
* include("include.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";
}
}
?>
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);
?>