保持谦卑之心
No design , No code

PHP学习笔记:php网络流量统计系统

说明:代码来源《PHP和MySQL Web应用开发》一书,还有就是代码有些是经过修改的,经过我的测验全部都可以用。

   这里面ip地址显示的正常的,我电脑是支持 ipv6 的。

本示例的数据库脚本 ~~~ 先执行 set names gbk;   (因为脚本中包含中文)再执行语句:  source d:\test\Vote.sql;

CREATE DATABASE IF NOT EXISTS FluxStat
COLLATE 'gb2312_chinese_ci';

USE FluxStat;
CREATE TABLE IF NOT EXISTS WebInfo (
    Id  INT  AUTO_INCREMENT  PRIMARY KEY,
    WebName VARCHAR(50), 
    WebUrl VARCHAR(200), 
    StartTime DATETIME,
    nTotalNum INT,
    nDayMax INT);

INSERT INTO WebInfo (WebName, WebUrl, StartTime, nTotalNum, nDayMax) 
VALUES ('流量统计系统首页', 'http://localhost/test3/FluxStat/index.php', '2015-07-07 0:0:0', 0, 0);

CREATE TABLE IF NOT EXISTS Visitors (
    Id  INT  AUTO_INCREMENT  PRIMARY KEY,
    vTime DATETIME,
    vIP VARCHAR(50),
    vOS VARCHAR(50), 
    vExp VARCHAR(50),
    vRef VARCHAR(50)
);

CREATE TABLE IF NOT EXISTS FluxStat  (
    Id INT AUTO_INCREMENT  PRIMARY KEY,
    D1 INT,
    D2 INT,
    D3 INT,
    D4 INT,
    D5 INT,
    D6 INT,
    D7 INT,
    D8 INT,
    D9 INT,
    D10 INT,
    D11 INT,
    D12 INT,
    D13 INT,
    D14 INT,
    D15 INT,
    D16 INT,
    D17 INT,
    D18 INT,
    D19 INT,
    D20 INT,
    D21 INT,
    D22 INT,
    D23 INT,
    D24 INT,
    D25 INT,
    D26 INT,
    D27 INT,
    D28 INT,
    D29 INT,
    D30 INT,
    D31 INT,
    MTotalNum INT
);

style.CSS  CSS样式代码

BODY
{
    FONT-FAMILY: 宋体;
    FONT-SIZE: 9pt
}
TABLE
{
    FONT-SIZE: 9pt
}
TR
{
    FONT-SIZE: 9pt
}
TD
{
    FONT-SIZE: 9pt
}
SELECT
{
    FONT-SIZE: 9pt
}
TEXTAREA
{
    FONT-SIZE: 9pt
}
INPUT
{
   FONT-SIZE: 9pt
}
A:link
{
    COLOR: blue;
    TEXT-DECORATION: none
}
A:visited
{
    COLOR: blue;
    TEXT-DECORATION: none
}
A:hover
{
    TEXT-DECORATION: underline
}

Class文件包含3个文件 FluxStat.php(FluxStat类) 、 Visitors.php(Visitors类) 以及 WebInfo.php(WebInfo类)

FluxStat.php  存放网站每天的访问数量

<?PHP
    class FluxStat
    {
        var $conn;

        public $Id;        //年月编号
        public $D1;        //每月第1日访问量
        public $D2;        //每月第2日访问量
        public $D3;        //每月第3日访问量
        public $D4;        //每月第4日访问量
        public $D5;        //每月第5日访问量
        public $D6;        //每月第6日访问量
        public $D7;        //每月第7日访问量
        public $D8;        //每月第8日访问量
        public $D9;        //每月第9日访问量
        public $D10;    //每月第10日访问量
        public $D11;    //每月第11日访问量
        public $D12;    //每月第12日访问量
        public $D13;    //每月第13日访问量
        public $D14;    //每月第14日访问量
        public $D15;    //每月第15日访问量
        public $D16;    //每月第16日访问量
        public $D17;    //每月第17日访问量
        public $D18;    //每月第18日访问量
        public $D19;    //每月第19日访问量
        public $D20;    //每月第20日访问量
        public $D21;    //每月第21日访问量
        public $D22;    //每月第22日访问量
        public $D23;    //每月第23日访问量
        public $D24;    //每月第24日访问量
        public $D25;    //每月第25日访问量
        public $D26;    //每月第26日访问量
        public $D27;    //每月第27日访问量
        public $D28;    //每月第28日访问量
        public $D29;    //每月第29日访问量
        public $D30;    //每月第30日访问量
        public $D31;    //每月第31日访问量
        public $MTotalNum;    //每月总访问量
        
                
        function __construct() {
            // 链接到数据库book,连接对象为$conn
            $this->conn = mysqli_connect("localhost", "root", "123456", "FluxStat"); 
            mysqli_query($this->conn, "SET NAMES utf-8");
        }
        
        function __destruct() {
            // 关闭$conn中保存的数据库连接
            mysqli_close($this->conn);
        }

        // 插入新记录
        function insert()
        {
            $sql = "INSERT INTO FluxStat VALUES ('" . $this->Id . "', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)";
            $this->conn->query($sql);
        }
        
        // 将指定列的值加1.参数$col表示指定的列名, 参数$id表示指定的记录编号
        function updateCount($col, $id)
        {
            $sql = "UPDATE FluxStat SET " . $col . "=" . $col . "+1, MTotalNum=MTotalNum+1 WHERE Id='" . $id . "'";
            $this->conn->query($sql);
        }

        // 判断hiding记录编号是否存在
        function exists($id)
        {
            $sql = "SELECT * FROM FluxStat WHERE Id='" . $id . "'";
            $result = $this->conn->query($sql);
            if($row = $result->fetch_row()) 
                return true;
            else
                return false;
        }

        // 获取某天的访问量。参数$col表示指定的列名, 参数$id表示指定的记录编号
        function GetDn($col, $id)
        {
            $sql = "SELECT ". $col . " FROM FluxStat WHERE Id='" . $id . "'";
            $result = $this->conn->query($sql);
            if($row = $result->fetch_row()) 
                return (int)$row[0];
            else
                return 0;
        }

        // 获取表FluxStat中保存的年份列表
        function GetYears()
        {
            $sql = "Select Distinct Left(id,4) AS sYear From FluxStat";
            $result = $this->conn->query($sql);
            return $result;
        }         

        // 装入指定月份的统计数据
        function load_FluxStat($id)
        {
            $sql = "SELECT * FROM FluxStat WHERE Id='" . $id . "'";
            $result = $this->conn->query($sql);
            Return $result;
        }

        // 装入指定年份的统计数据
        function load_FluxStat_byYear($year)
        {
            $sql = "SELECT * FROM FluxStat WHERE Left(Id,4)='" . $year . "'";
            $result = $this->conn->query($sql);
            Return $result;
        }
    }
?>

Visitors.php  存放最近的20位访问者信息

<?PHP
    class Visitors
    {
        var $conn;

        public $Id;            //访问者编号,主键,自动加1
        public $vTime;        //访问时间
        public $vIP;        //IP地址
        public $vOS;        //操作系统
        public $vExp;        //浏览器
        public $vRef;        //来源
        
                
        function __construct() {    
            // 链接到数据库book,连接对象为$conn        
            $this->conn = mysqli_connect("localhost", "root", "123456", "FluxStat"); 
            mysqli_query($this->conn, "SET NAMES utf-8");
        }
        
        function __destruct() {            
            // 关闭$conn中保存的数据库连接
            mysqli_close($this->conn);
        }

        // 插入新记录
        function insert()
        {
            $sql = "INSERT INTO Visitors (vTime, vIP, vOS, vExp, vRef) VALUES('" . $this->vTime . "', '" . $this->vIP . "', '" . $this->vOS . "','" . $this->vExp . "','" . $this->vRef . "')";
            $this->conn->query($sql);
        }
        
        //获取表中的记录数量
        function GetRecordCount()
        {            
            $sql = "SELECT COUNT(*) FROM visitors";
            $result = $this->conn->query($sql);
            if($row = $result->fetch_row())  
                Return (int)$row[0];
            else
                Return 0;        
        }
        
        //删除编号最小的记录数量
        function deleteMinRecord()
        {
            $sql = "DELETE FROM Visitors WHERE ID IN (SELECT Max(ID) FROM Visitors)";
            $this->conn->query($sql);
        }
        
        //获取最近的20个访问者记录,返回结果集
        function get_latest20()
        {
            $sql = "SELECT * FROM Visitors ORDER BY vTime DESC LIMIT 0,20";
            $results = $this->conn->query($sql);
            return $results;
        }
    }
?>

WebInfo.php  存放进行流量统计的网站的基本信息

<?PHP
    class WebInfo
    {
        var $conn;

        public $Id;                //网站ID号,主键,自动增加1
        public $WebName;        //网站名称
        public $WebURL;            //网站
        public $StartTime;        //开始统计时间
        public $nTotalNum;        //总访问量
        public $nDayMax;        //最高日访问量
                
        function __construct() {
            // 链接到数据库book,连接对象为$conn
            $this->conn = mysqli_connect("localhost", "root", "123456", "FluxStat"); 
            mysqli_query($this->conn, "SET NAMES utf-8");
        }
        
        function __destruct() {
            // 关闭$conn中保存的数据库连接
            mysqli_close($this->conn);
        }

        // 插入新记录
        function insert()
        {
            $sql = "INSERT INTO WebInfo (WebName, WebURL, StartTime, nTotalNum, nDayMax) VALUES('" . $this->WebName . "', '" . $this->WebURL . "', '" .  $this->StartTime . "', 0, 0)";
            $this->conn->query($sql);
        }        
        
        // 删除记录,参数$Id表示记录编号
        function delete($Id)
        {
            $sql = "DELETE FROM WebInfo WHERE Id=" . $Id;
            $this->conn->query($sql);
        }            
        
        //获取日最高访问量
        function GetDayMax()
        {
            $sql = "SELECT nDayMax FROM WebInfo WHERE Id=1";
            $result = $this->conn->query($sql);
            if($row = $result->fetch_row())
                return (int)$row[0];
            else
                return 0;
        }    

        //更新日最高访问量
        function updateDayMax($dayMax, $id)
        {
            $sql = "UPDATE WebInfo SET nDayMax=" . $dayMax . " WHERE Id=" . $id;
            $this->conn->query($sql);
        }

        //将总访问量增加1
        function increaseTotalNum()
        {
            $sql = "Update WebInfo Set nTotalNum=nTotalNum+1 Where id=1";
            $this->conn->query($sql);
        }
        
        //获取网站的基本信息
        function getWebInfo()
        {
            $sql = "Select * From WebInfo Where id=1";
            $results = $this->conn->query($sql);
            if($row = $results->fetch_row()) {
                $this->Id = (int)$row[0];
                $this->WebName = $row[1];        
                $this->WebURL = $row[2];        
                $this->StartTime = $row[3];        
                $this->nTotalNum = (int)$row[4];
                $this->nDayMax = (int)$row[5];                
            }
        }

        //计算并返回两个日期之差,单位为天
        function datediff($date1, $date2)
        {
            $sql = "SELECT datediff('" . $date1 . "', '" . $date2 . "')";
            $results = $this->conn->query($sql);
            if($row = $results->fetch_row()) 
                return $row[0];
            else
                return 0;
        }
    }
?>

Function.php  函数库,存放本项目的大部分函数

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″> 
<?PHP

error_reporting(0); 
function GetCurrentTime()  {
    //以yyyy-mm-dd hh:MM:ss 返回当前的系统时间
  date_default_timezone_set('Asia/Chongqing'); //系统时间差8小时问题
  $cur_time = getdate();
  return $cur_time['year'] . "-" . $cur_time['mon'] . "-" . $cur_time['mday']  . " " . $cur_time['hours'] . ":" . $cur_time['minutes'] . ":" . $cur_time['seconds'];
  //程序调用getdate()函数获取当前系统时间,结果保存在$cur_time数组中,然后将$cur_time数组中的元素构建成指定格式的字符串,作为函数的返回值
}

/*
function GetExplore()  {
    //返回客户端用户使用的浏览器
    $explore = "";
    $Agent = $_SERVER["HTTP_USER_AGENT"];
    //echo($Agent);
    //使用$_SERVER["HTTP_USER_AGENT"]返回访问当前网页的客户端信息。
    //例如:win7,IE9.0 ————> Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
    // 找到第1个;的位置
    $pos = strpos($Agent, ';');
    if($pos < 0)
        return "";
        
    $explore = substr($Agent, $pos+1, strlen($Agent)-$pos);    // 截取第1个分号后面的字符串
    // 找到第2个;的位置
    $pos = strpos($explore, ';');
    // 第1个分号和第2个分号之间是浏览器信息    
    $explore = substr($explore, 0, $pos);
    return $explore;
}
//书中所给的代码有误,就是判断浏览器出错,因为在谷歌中$Agent = $_SERVER["HTTP_USER_AGENT"];返回的是Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.65 Safari/537.36
*/
/*
IE mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)
mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0; 360se)
搜狗 mozilla/4.0 (compatible; msie 7.0; windows nt 5.1; trident/4.0; se 2.x metasr 1.0)
世界之窗 mozilla/4.0 (compatible; msie 7.0; windows nt 5.1; trident/4.0)
遨游 mozilla/5.0 (windows nt 5.1) applewebkit/535.12 (khtml, like gecko) maxthon/3.3.4.4000 chrome/18.0.966.0 safari/535.12
火狐 mozilla/5.0 (windows nt 5.1; rv:8.0.1) gecko/20100101 firefox/8.0.1
谷歌 mozilla/5.0 (windows nt 5.1) applewebkit/535.11 (khtml, like gecko) chrome/17.0.963.26 safari/535.11
opera opera/9.80 (windows nt 5.1; u; edition next; zh-cn) presto/2.10.255 version/12.00
*/

//通过修改过的,其他几个就先不试了,具体的其他浏览器返回信息在上面
function GetExplore()  {
    $Agent = $_SERVER["HTTP_USER_AGENT"];
    $browseragent="";   //浏览器
$browserversion=""; //浏览器的版本
if (preg_match('/MSIE ([0-9].[0-9]{1,2})/i',$Agent,$version)) {
 $browserversion=$version[1];
 $browseragent="Internet Explorer";
} else if (preg_match( '/Opera\/([0-9]{1,2}.[0-9]{1,2})/i',$Agent,$version)) {
 $browserversion=$version[1];
 $browseragent="Opera";
} else if (preg_match( '/Firefox\/([0-9.]{1,5})/i',$Agent,$version)) {
 $browserversion=$version[1];
 $browseragent="Firefox";
}else if (preg_match( '/Chrome\/([0-9.]{1,3})/i',$Agent,$version)) {
 $browserversion=$version[1];
 $browseragent="Chrome";
}
else if (preg_match( '/Safari\/([0-9.]{1,3})/i',$Agent,$version)) {
 $browseragent="Safari";
 $browserversion="";
}
else {
$browserversion="";
$browseragent="Unknown";
}
return $browseragent." ".$browserversion;
}


function GetOSInfo()  {
    // 在获取客户端的浏览器信息时,包含操作系统信息
    $os="";
    $Agent = $_SERVER["HTTP_USER_AGENT"];
    if (preg_match('/win/i',$Agent) && strpos($Agent, '95')) {
        $os="Windows 95";
    }
    elseif (preg_match('/win 9x/i',$Agent) && strpos($Agent, '4.90')) {
        $os="Windows ME";
    }
    elseif (preg_match('/win/i',$Agent) && ereg('98',$Agent)) {
        $os="Windows 98";    
    }
    elseif (preg_match('/win/i',$Agent) && preg_match('/nt 5\.0/i',$Agent)) { 
        $os="Windows 2000"; 
    }
    elseif (preg_match('/win/i',$Agent) && preg_match('/nt 5\.2/i',$Agent)) { 
        $os="Windows 2003"; 
    }
    elseif (preg_match('/win/i',$Agent) && preg_match('/nt 5\.1/i',$Agent)) { 
        $os="Windows XP"; 
    } 
    elseif (preg_match('/win/i',$Agent) && preg_match('/nt 6\.1/i',$Agent)) { 
        $os="Windows 7"; 
    }     
    elseif (preg_match('/win/i',$Agent) && preg_match('/32/i',$Agent)) {
        $os="Windows 32";
    }
    elseif (preg_match('/win/i',$Agent) && preg_match('/nt/i',$Agent)) {
        $os="Windows NT";
    }    
    elseif (preg_match('/linux/i',$Agent)) {
        $os="Linux";
    }
    elseif (preg_match('/unix/i',$Agent)) {
        $os="Unix";
    }
    elseif (preg_match('/sun/i',$Agent) && preg_match('/os/',$Agent)) {
        $os="SunOS";
    }
    elseif (preg_match('/ibm/i',$Agent) && preg_match('/os/',$Agent)) {
        $os="IBM OS/2";
    }
    elseif (preg_match('/Mac/',$Agent) && preg_match('/PC/',$Agent)) {
        $os="Macintosh";
    }
    elseif (preg_match('/PowerPC/i',$Agent)) {
        $os="PowerPC";
    }
    elseif (preg_match('/AIX/',$Agent)) {
        $os="AIX";
    }
    elseif (preg_match('/HPUX/',$Agent)) {
        $os="HPUX";
    }
    elseif (preg_match('/NetBSD/',$Agent)) {
        $os="NetBSD";
    }
    elseif (preg_match('/BSD/',$Agent)) {
        $os="BSD";
    }
    elseif (ereg('OSF1',$Agent)) {
        $os="OSF1";
    }
    elseif (ereg('IRIX',$Agent)) {
        $os="IRIX";
    }
    elseif (preg_match('/FreeBSD/',$Agent)) {
        $os="FreeBSD";
    }
    if ($os=='') 
        $os = "Unknown";
    return $os;
    //eregi()函数用于实现不区分大小写的正则表达式匹配,语法为 int eregi(string $pattern,string $string,[,array $regs])
    //只是在php5.3之后不再支持eregi(), 了改为preg_match()
}

?>

Index.php    访问者界面代码

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″> 
<?PHP
    //获取客户端信息代码
    include('function.php');
    include('Class\Visitors.php');
    $objVisitor = new Visitors();
    // 收集需要统计的信息
    $theurl = $_SERVER['PHP_SELF'];        // 当前的URL
    $objVisitor->vIP = $_SERVER['REMOTE_ADDR'];        // IP地址
    $objVisitor->vOS = GetOSInfo();                    // 自定义函数,获取客户端的操作系统
    // 获取浏览器信息
    $objVisitor->vExp = GetExplore();//$arr->parent;
    $objVisitor->vRef = $_SERVER['HTTP_REFERER'];    // 访问前的网址
    if($objVisitor->vRef == "")
      $objVisitor->vRef = "直接输入或书签导入";
    //echo($_SERVER["HTTP_USER_AGENT"]);
    // 获取当前时间
    $objVisitor->vTime = GetCurrentTime();
?>
<table border=1 width="400">
<tr><td>您访问的时间</td><td><?PHP echo($objVisitor->vTime); ?></td></tr>
<tr><td>您的IP地址</td><td><?PHP echo($objVisitor->vIP); ?></td></tr>
<tr><td>操作系统</td><td><?PHP echo($objVisitor->vOS); ?></td></tr>
<tr><td>浏览器</td><td><?PHP echo($objVisitor->vExp); ?></td></tr>
<tr><td>来自</td><td><?PHP echo($objVisitor->vRef); ?> </td></tr>
<tr><td>当前页面</td><td><?PHP echo($theurl); ?></td></tr>
</table>
<P align=center><a href="main.php">查看网站流量统计信息</a></P>
<?PHP
    //添加访问者信息到表Visitors中
    $nCount = $objVisitor->GetRecordCount();
    // 保存数据到数据库,数据库中只保存最近访问的20条信息
    if($nCount >= 20)
        $objVisitor->deleteMinRecord();    // 如果记录数大于20,则删除最小的值
    // 保存数据
    $objVisitor->insert();
    //-----------------------------------
    //更新当天访问量和当月访问量
    date_default_timezone_set('Asia/Chongqing'); //系统时间差8小时问题    
    $cur_time = getdate();
    $id = $cur_time['year'] . $cur_time['mon'];    // 表FluxStat中的Id字段值
    $col = "D" . $cur_time['mday'];
    // 判断当前月的记录是否存在
    include('Class\FluxStat.php');
    $objFlux = new FluxStat();
    if(!$objFlux->exists($id))  {
        // 没有则插入记录
        $objFlux->Id = $id;
        $objFlux->insert();
    }
    else {
        $objFlux->updateCount($col, $id);
    }
    
    // ---------------------------------
    // 比较日访问量最大值
    $nToday = $objFlux->GetDn($col, $id);
    include('Class\WebInfo.php');
    $objWeb = new WebInfo();
    $nDayMaxNum = $objWeb->GetDayMax();        // 获取WebInfo中的日访问量最大值
    // 如果当日访问量大于日访问量,则更新记录
    if($nToday > $nDayMaxNum)
        $objWeb->updateDayMax($nToday, 1); 
    //---------------------------------
    // 更新总访问量
    $objWeb->increaseTotalNum(); 
?>

ToIndex.html  跳转到主页Index.php的界面

<html>
<body>
<p><a href="Index.php">转向主页</a></p>
</body>
</html>

main.php    网站信息界面代码

<head>
  <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″> 
<title>网站流量统计系统</title>
<link rel="stylesheet" href="style.css">
</head>
<!--显示网站信息界面-->
<table width="50%" align=center>
<tr><td align="center"><td align="center">网站基本信息</td>
<td align="center"><a href="Visitors.php">最近访问者信息</a></td>
<td align="center"><a href="FluxMonth.php">按月访问量统计</a></td>
<td align="center"><a href="FluxYear.php">按年访问量统计</a></td></tr>
</table>
<br>
<?PHP
  //获取数据库中相应的数据
  date_default_timezone_set('Asia/Chongqing'); //系统时间差8小时问题    
  $date = getdate();
  $now = $date['year'] . "-" . $date['mon'] . "-" . $date['mday'];        // 获取当前系统时间
  $nTotalNum = 0;
  $nDayMaxNum = 0;
  $sWebURL = "";
  $sWebName = "";
  include('Class\WebInfo.php');
  $objWebinfo = new WebInfo();    
  $objWebinfo->getWebInfo();    // 获取网站信息
  if($objWebinfo->Id == 0)
    exit("请在数据库中输入网站基本信息");

  // 统计天数 = 目前时间-统计开始时间

  $nStatDays = $objWebinfo->datediff($now, $objWebinfo->StartTime);    // 利用mysql计算时间差
  if($nStatDays==0)
    $nStatDayNum = 1;
  // 平均日访问量 = 总访问量/访问天数
  if($nStatDays<=0)
    $nDayAve = $nTotalNum;
  else
    $nDayAve = (int)($nTotalNum/$nStatDays);
  // 得到当天访问量
  $nToDayNum=0;
  $sYear = $date['year'];
  $sMonth = $date['mon'];
  $sId = $sYear . $sMonth;
  $sDay = $date['mday'];
  $sCol = "D" . $sDay;    // 获取今天对应FluxStat表中的字段名
  include('Class\FluxStat.php');
  $objFlux = new FluxStat();
  $nToDayNum = $objFlux->GetDn($sCol, $sId);
?>
<table width="70%" border=1  cellpadding=0 cellspacing=0 align="center">
  <tbody> 
    <tr> 
      <td> 
        <table border=1 cellpadding=3 cellspacing=0 width="100%" bgcolor="#FFFF99" height="266">
          <tbody> 
          <tr> 
            <td colspan=4 align="center" bgcolor="#C4E2F0" height="16">
            网 站 综 合 统 计 信 息 
            </td>
          </tr>
          <tr bgcolor="#FFFFFF"> 
            <td align=left colspan=2 height="16">网站名称</td>
            <td align=right colspan=2 height="16"><?PHP echo($objWebinfo->WebName); ?></td>
          </tr>
          <tr bgcolor="#E4E4E4"> 
            <td align=left colspan=2 height="16" >网站网址</td>
            <td align=right colspan=2 height="16"><a href="<%=sWebURL%>" target="_blank"><?PHP echo($objWebinfo->WebURL); ?></a></td>
          </tr>
          <tr bgcolor="#FFFFFF"> 
            <td align=left colspan=2 height="16">总统计天数</td>
            <td align=right colspan=2 height="16"><?PHP echo($nStatDays); ?></td>
          </tr>
          <tr bgcolor="#E4E4E4"> 
            <td align=left colspan=2 height="16">开始统计日期</td>
            <td align=right colspan=2 height="16"><?PHP echo($objWebinfo->StartTime); ?></td>
          </tr>
          <tr bgcolor="#FFFFFF"> 
            <td align=left colspan=2 height="16">总访问量</td>
            <td align=right colspan=2 height="16"><?PHP echo($nTotalNum); ?></td>
          </tr>
          <tr bgcolor="#E4E4E4"> 
            <td align=left colspan=2 height="16">平均日访量</td>
            <td align=right colspan=2 height="16"><?PHP echo($nDayAve); ?></td>
          </tr>
          <tr bgcolor="#FFFFFF"> 
            <td align=left colspan=2 height="15">今日访问量</td>
            <td align=right colspan=2 height="15"><?PHP echo($nToDayNum); ?></td>
          </tr>
         <tr bgcolor="#E4E4E4"> 
            <td align=left colspan=2 height="16">最高日访量</td>
            <td align=right colspan=2 height="16"><?PHP echo($objWebinfo->nDayMax); ?></td>
          </tr>
          <tr align="right"> 
            <td colspan=4 bgcolor="#C4E2F0" height="19"> 
              <p> </p>
            </td>
          </tr>
          </tbody> 
        </table>
      </td>
    </tr>
  </tbody> 
</table>

Visitors.php  最近访问者界面代码

<html><!--最近访问者界面代码-->
<head><title>最近20位访问者信息</title>
  <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″> 
<link rel="stylesheet" href="style.css"></head>
<body>
<table width="50%" align=center>
<td align="center"><a href="main.php">网站基本信息</a></td>
<td align="center">最近访问者信息</td>
<td align="center"><a href="FluxMonth.php">按月访问量统计</a></td>
<td align="center"><a href="FluxYear.php">按年访问量统计</a></td></tr>
</table>
<?PHP
  include('Class\Visitors.php');
  $objVisitor = new Visitors();
  $results = $objVisitor->get_latest20();
?>
<table width="70%" border=1 cellpadding=0 cellspacing=0 bgcolor="#FFFF99" align="center">
  <tbody> 
          <tr> 
            <td align="center" height="30" bgcolor="#C4E2F0">最 近 20 位 访 问 者 信 息</td>                                     
          </tr>    <tr> 
      <td height="33"> 
        <table border=0 cellpadding=3 cellspacing=0 width="100%" bgcolor="#FFFFFF">
          <tbody> 

          <tr bgcolor="#E4E4E4"> 
            <td align=left width="20%">时间</td>
            <td align=left width="14%">IP地址</td>
            <td align=left width="16%">操作系统</td>
            <td align=left width="20%">浏览器</td>
            <td align=left width="30%">链接页面</td>
          </tr>
<?PHP
  // 依次处理结果集中的所有访问者信息
  while($row = $results->fetch_row())  {
    $sReferer=$row[5];
?>
          <tr bgcolor="#FFFFFF"> 
            <td align=left><?PHP echo($row[1]); ?></td>
            <td align=left><?PHP echo($row[2]); ?></td>
            <td align=left><?PHP echo($row[3]); ?></td>
            <td align=left><?PHP echo($row[4]); ?></td>
            <td align=left>
      <?PHP 
        if($sReferer=="直接输入或书签导入")
              echo($sReferer);
        else {
            echo("<a href='" . $sReferer . "' title=" . $sReferer . " target='_blank'>" . substr($sReferer,0, 36) . "</a>");
        }
      ?>  
      </td>
          </tr>
<?PHP 
  }
?>
          </tbody> 
        </table>
      </td>
    </tr>
    <tr align="right"> 
            <td bgcolor="#C4E2F0" height="30"> 
              <p> </p>
            </td>
          </tr>
  </tbody> 
</table>
</body>
</html>

FluxMonth.php  按月统计界面代码

<html><!--按月统计界面代码-->
<head><title>按月份统计</title>
    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″> 
<link rel="stylesheet" href="style.css"></head>
<Script Language="JavaScript">
  function MonthSubmit() {
    var sYear,strURL,sMonth;
    sYear = document.form1.year.value;
    sMonth= document.form1.mn.value;
    strURL = "FluxMonth.php?year=" + sYear + "&month=" + sMonth;
    form1.action = strURL;
    form1.submit();
  }
</Script><body>
<form name="form1" action="FluxMonth.php" method="post">
<table width="50%" align=center>
<tr>
<td align="center"><a href="main.php">网站基本信息</a></td>
<td align="center"><a href="Visitors.php">最近访问者信息</a></td>
<td align="center">按月访问量统计</td>
<td align="center"><a href="FluxYear.php">按年访问量统计</a></td>
</tr>
</table>
<?PHP
    // 取得统计月份
error_reporting(0); 
date_default_timezone_set('PRC');
    $sYear = $_GET["year"];
    $sMonth = $_GET["month"];
    $date = getdate();
    if($sYear=="")
       $sYear = $date['year'];
    if($sMonth=="")
       $sMonth= $date['mon'];
    $sId = $sYear . $sMonth;
?>
                 
<!--加这些是为了让界面好看,这是空格字符代码-->
选择统计年份:<select name="year">
<?PHP
    //得到数据库中有记录的年份
    include('Class\FluxStat.php');
    $objFlux = new FluxStat();
    $results = $objFlux->GetYears();
    //将年份显示在组合框中
    while($row = $results->fetch_row())  {
        $rsYear = $row[0];
        if($sYear==$rsYear)
            echo("<option value=" . $row[0] . " selected>" . $row[0] . "年</option>");
        else
            echo("<option value=" . $row[0] . ">" . $row[0] . "年</option>");
    }
?>
</select>
选择统计月份:<select name="mn" onChange="MonthSubmit()">
<?PHP
    for($i=1; $i<13; $i++)  {
        if($sMonth==$i)    // 如果是当前月,则选中
            echo("<option value=". $i . " selected>" . $i . "月</option>");
        else
            echo("<option value=" . $i . ">" . $i . "月</option>");
    }
?>
</select>
</form>
<table width="70%" border=1 bgcolor=#FFFF99 cellpadding=0 cellspacing=0 align="center">
  <tbody> 
     <tr> 
        <td align="center" bgcolor="#C4E2F0" height="30"><?PHP echo($sYear); ?> 年 <?PHP echo($sMonth); ?> 月 访 问 统 计 (总访问量:<?PHP echo($nMonthTotalNum); ?>人次)</td>
    </tr>
    <tr> 
      <td> 
        <table border=0 cellpadding=3 cellspacing=0 width="100%" bgcolor="#FFFFFF">
          <tbody> 

          <tr bgcolor="#CCCCCC"> 
            <td align=left width="20%">日期</td>
            <td align=left width="20%">访问人数</td>
            <td align=left width="60%">百分比</td>
          </tr>
          <?PHP 
    // 定义数组值为0,nDArr(30)表示每天访问量
    // nPArr(30)表示每天的百分比,nBArr(30)表示图形的长度
    for($i=0; $i<=30; $i++)  {
        $nDArr[$i] = 0;
        $nPArr[$i] = 0;
        $nBArr[$i] = 0;
    }
    // 取得此月份的访问量信息
    $results = $objFlux->load_FluxStat($sId);
    $i=0;
    if($row = $results->fetch_row())  {
        for($i=0; $i<=30; $i++) {
            $nDArr[$i] = $row[$i+1];
            $nMonthTotalNum = (int)$row[32];
        }
    }
    if($nMonthTotalNum>0) {
        for($i=0; $i<=30; $i++)  {
            $nPArr[$i] = ($nDArr[$i]/$nMonthTotalNum*10000)/100 . "%";
            $nBArr[$i] = $nDArr[$i]/$nMonthTotalNum*200;
        }
    }
            for($i=0; $i<=30; $i++) { ?> 
          <tr bgcolor="#FFFFFF"> 
            <td align=left><?PHP echo($sMonth); ?>月<?PHP echo($i+1); ?>日</td>
            <td align=left><?PHP echo($nDArr[$i]); ?></td>
            <td align=left><img src="images/bar.gif" width="<?PHP echo($nBArr[$i]); ?> "height="12"><?PHP echo($nPArr[$i]); ?></td>
          </tr>
          <?PHP } /* end of for */ ?> 
          </tbody> 
        </table>
      </td>
    </tr>
     <tr><td bgcolor="#C4E2F0" height="30"> </td>
     </tr>
  </tbody> 
</table>
</body>
</html>

FluxYear.php   按年统计界面代码

<!--按年统计界面代码-->
<?PHP
error_reporting(0); 
date_default_timezone_set('PRC');
    // 取得统计类型
    $sYear = $_GET["year"];
    $date = getdate();    // 获取当前时间
    if($sYear=="")
        $sYear = $date['year'];
?>
<html>
<head><title>按年度统计</title>
    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″> 
<link rel="stylesheet" href="style.css"></head>
<Script Language="JavaScript">
  function YearSubmit() {
    var sYear,strURL;
    sYear = document.form1.year.value;
    strURL = "FluxYear.php?year=" + sYear;
    form1.action = strURL;
    form1.submit();
  }
</Script>
<body>
<form name="form1" action="FluxYear.php" method="post">
<table width="50%" align=center cellspacing="0" cellpadding="0" style="margin-top: 0; margin-bottom: 0">
<td align="center"><a href="main.php">网站基本信息</a></td>
<td align="center"><a href="Visitors.php">最近访问者信息</a></td>
<td align="center"><a href="FluxMonth.php">按月访问量统计</a></td>
<td align="center">按年访问量统计</td>
</tr>
</table><br>
                 
<!--加这些是为了让界面好看,这是空格字符代码-->
选择统计年份:<select name="year" onChange="YearSubmit()">
<?PHP
    //得到数据库中有记录的年份
    include('Class\FluxStat.php');
    $objFlux = new FluxStat();
    $results = $objFlux->GetYears();
    //将年份显示在组合框中
    while($row = $results->fetch_row())  {
        $rsYear = $row[0];
        if($sYear==$rsYear)
            echo("<option value=" . $row[0] . " selected>" . $row[0] . "年</option>");
        else
            echo("<option value=" . $row[0] . ">" . $row[0] . "年</option>");
    }
?>
</select>
<?PHP
    // 定义数组值为0,nMArr(12)表示每月访问量
    // nPArr(12)表示每天的百分比,nBArr(12)表示图形的长度
    for($i=0; $i<=30; $i++)  {
        $nMArr[$i] = 0;
        $nPArr[$i] = 0;
        $nBArr[$i] = 0;
    }
    // 取得此月份的访问量信息
    $results = $objFlux->load_FluxStat_byYear($sYear);
    $i=0;
    if($row = $results->fetch_row())  {
        $sId = substr($row[0], 4, strlen($row[0])-4);    // 获取Id字段后面的月份字符串
        $nMArr[(int)$sId - 1] = (int)$row[32];    // 保存各月份的访问数据    
        $nYearTotal = $nYearTotal + (int)$row[32];
    }
    if($nYearTotal>0) {
        for($i=0; $i<=11; $i++)  {
            $nPArr[$i] = ($nMArr[$i]/$nYearTotal*10000)/100 . "%";
            $nBArr[$i] = $nMArr[$i]/$nYearTotal*200;
        }
    }
?>
<table width="70%" border=1 bgcolor=#FFFF99 cellpadding=0 cellspacing=0 align="center">
  <tbody> 
    <tr> 
      <td align="center" bgcolor="#C4E2F0" height="30"><?PHP echo($sYear); ?> 年 访 问 统 计 (总访问量:<?PHP echo($nYearTotal); ?>人次)</td>
    </tr>
    <tr> 
      <td> 
        <table border=0 cellpadding=3 cellspacing=0 width="100%" bgcolor="#FFFFFF">
          <tbody> 
          <tr bgcolor="#CCCCCC"> 
            <td align=left width="20%">月份</td>
            <td align=left width="20%">访问人数</td>
            <td align=left width="60%">百分比</td>
          </tr>
          <?PHP for($i=0; $i<12; $i++) { ?> 
          <tr bgcolor="#FFFFFF"> 
            <td align=left><?PHP echo($sYear); ?>年<?PHP echo($i+1); ?>月</td>
            <td align=left><?PHP echo($nMArr[$i]); ?></td>
            <td align=left><img src="images/bar.gif" width="<?PHP echo($nBArr[$i]); ?> "height="12"><?PHP echo($nPArr[$i]); ?></td>
          </tr>
          <?PHP } /* end of for */ ?> 
          </tbody> 
        </table>
      </td>
    </tr>
    <tr height="30"><td bgcolor="#C4E2F0">  </td>
    </tr>    
  </tbody> 
</table>
</form>
</body>
</html>
赞(0) 打赏
未经允许不得转载:吴庆宝的个人blog » PHP学习笔记:php网络流量统计系统

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

吴庆宝的技术博客

技术博客github

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏