php实现从本网站每天出站连接向目标网站贡献的IP和PV的统计

一般目标网站的网址连接是这样的样式:

http://localhost/tongji/url.php?wangzhan=piaoliang&r=http://www.taobao.com/

存入数据库:

 

  
  
  
  
  1. <?php  
  2.     header("Content-type: text/html; charset=utf-8");   
  3.     //echo $_COOKIE['iptag'];  
  4.     date_default_timezone_set('PRC');  
  5.       
  6.     //目标网站url      
  7.     $aimUrl = $_GET['r'];  
  8.     //来源网站  
  9.     $sourceUrl = $_GET['wangzhan'];  
  10.     //设置cookie标识符,目的是防止当产生cookie后用户在点击其他链接,造成的统计不精确  
  11.     $cookieTag = $aimUrl.$sourceUrl;  
  12.     //明天零时的时间戳  
  13.     $nonce_time = strtotime(date('Ymd')+1);  
  14.     setcookie('iptag',$cookieTag,$nonce_time);  
  15.     //获得当前时间,用于数据库查询  
  16.     $time = date('Y-m-d');  
  17.     $db = new MySQLi('localhost','a','acyr','www_a_com');     
  18.     if ($mysqli->connect_errno) {  
  19.        die('数据库连失败:'.$mysqli->connect_error);  
  20.     }  
  21.     $db->query('set names utf8');  
  22.     $sql = "select * from dede_tongji where sourceUrl='$sourceUrl' and aimUrl='$aimUrl' and date='$time'";  
  23.     $res = $db->query($sql);  
  24.       
  25.     //首先查看现在数据库这一天有没有这个链接的数据,如果没有则创建,否则根据cookie值,来判断IP和Pv的分别增加多少。  
  26.     if ( $row = $res->fetch_assoc() ){  
  27.         $pvSum = $row['pvSum'] + 1;  
  28.         if$_COOKIE['iptag'] == $cookieTag ){  
  29.             $sql = "update dede_tongji set pvSum = '$pvSum' where sourceUrl='$sourceUrl' and aimUrl='$aimUrl' and date='$time' ";  
  30.             $db->query($sql);     
  31.               
  32.         //否则只是ip 和pv 增加一      
  33.         }else{  
  34.             $ipSum = $row['ipSum'] + 1;  
  35.             $sql = "update dede_tongji set ipSum = '$ipSum',pvSum = '$pvSum' where sourceUrl='$sourceUrl' and aimUrl='$aimUrl' and date='$time' ";  
  36.             $db->query($sql);  
  37.         }  
  38.               
  39.     }else{  
  40.           
  41.         //数据库中没有则添加一条新数据  
  42.         $sql = "insert into dede_tongji (sourceUrl,aimUrl,ipSum,pvSum,date) values ('$sourceUrl','$aimUrl',1,1,'$time')";  
  43.         if$db->query($sql)){  
  44.         }else{  
  45.             $db->error;  
  46.         }  
  47.  
  48.     }  
  49.     //利用js实现跳转  
  50.     echo "<script language='javascript'>location.href='".$aimUrl."'</script>";  
  51. ?>  

从数据库中查询,这里使用到了一个分页类在我的令一片博客里大家可以找到,关于这个分页类的用法 结合这个例子和分页类的成员函数可以很好的理解,主要是在进行数据库查询时sql语句带上 limit 限定条件就可以了,用到的分页类是:page.class.php

下面是从数据库中查询前台显示数据和分页类的使用,还有一些控制日期的js

 

  
  
  
  
  1. <?php  
  2.     header("Content-type: text/html; charset=utf-8");  
  3.     date_default_timezone_set('PRC');   
  4.     //引入分页类  
  5.     require_once 'page.class.php';   
  6.     //获取变量   
  7.     $wangzhan = emptyempty($_GET['wangzhan']) ? '' : $_GET['wangzhan'];  
  8.     //如果月份和日期小于10则加0 用于数据库日期匹配  
  9.     $mm = $_GET['MM'];  
  10.     $dd = $_GET['DD'];  
  11.     if$mm < 10 ){  
  12.         $mm = '0'.$mm;  
  13.     }  
  14.     if$dd < 10 ){  
  15.         $dd = '0'.$dd;  
  16.     }  
  17.     $date = $_GET['YYYY'].'-'.$mm.'-'.$dd;  
  18.       
  19.     //echo $date;  
  20.     //$time = date('Y-m-d');  
  21.     //echo 'time:'.$time.'<br>';  
  22.     //echo $date;  
  23.     //exit();  
  24.     //连接数据库  
  25.     $db = new MySQLi('localhost','a','acyr','www_a_com');     
  26.     if ($mysqli->connect_errno) {  
  27.        die('数据库连失败:'.$mysqli->connect_error);  
  28.     }  
  29.     $db->query('set names utf8');  
  30.     //如果现在的查询日期是当前日期,则全部输出且按日期排序  
  31.     if($date==$time){  
  32.         //获得这种情况下的总条数,用于分页显示(分页类要用到这个参数)  
  33.         $sql = "select count(*) from dede_tongji where sourceUrl='$wangzhan' order by date desc";  
  34.         $row = $db->query($sql)->fetch_row();  
  35.         $allRows = $row[0];  //总条数  
  36.         $pageList = new Page($allRows,2,4,array('pre'=>'上一页','next'=>'下一页'));  
  37.         //$res = $db->query( "select * from dede_tongji where sourceUrl='$wangzhan' order by date desc {$pageList->limit()}" );   
  38.         $sql = "select * from dede_tongji where sourceUrl='$wangzhan' order by date desc {$pageList->limit()}";  
  39.         //echo $sql;  
  40.           
  41.         $res = $db->query($sql);  
  42.         $resArr = array();  
  43.         while$row = $res->fetch_assoc()){  
  44.                 $resArr[] = $row;  
  45.         }  
  46.         $res->free_result();  
  47.           
  48.         /*echo '<pre>';  
  49.         var_dump($resArr);  
  50.         foreach( $resArr as $v ){  
  51.             echo  $v['aimUrl'];  
  52.         }*/ 
  53.         //print_r($res);  
  54.         //exit();  
  55.     }else{  
  56.         //获得这种情况下的总条数,用于分页显示  
  57.         $sql = "select count(*) from dede_tongji where sourceUrl='$wangzhan' and date='$date'";  
  58.         $row = $db->query($sql)->fetch_row();  
  59.         $allRows = $row[0];  //总条数  
  60.         $pageList = new Page($allRows,2,4,array('pre'=>'上一页','next'=>'下一页'));  
  61.         $sql = "select * from dede_tongji where sourceUrl='$wangzhan' and date='$date' {$pageList->limit()} ";  
  62.         //echo $sql;  
  63.         $res = $db->query($sql);  
  64.         $resArr = array();  
  65.         while$row = $res->fetch_assoc()){  
  66.                 $resArr[] = $row;  
  67.         }  
  68.         $res->free_result();  
  69.         //print_r($res);  
  70.         //exit();  
  71.     }  
  72.  
  73. ?>  
  74. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  75. <html xmlns="http://www.w3.org/1999/xhtml">  
  76. <head>  
  77. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  78. <title>统计结果</title>  
  79. <style type="text/css">  
  80. /*头部样式*/ 
  81. .top {  
  82.     margin-right: auto;  
  83.     margin-left: auto;  
  84.     width: 800px;  
  85.     margin-top: 100px;  
  86. }  
  87. /*表格样式*/ 
  88. table td{  
  89.     border:1px solid #999;  
  90.     padding:0px 5px;  
  91. }  
  92.  
  93. /*分页样式*/ 
  94. .pagelist{  
  95.     margin-right: auto;  
  96.     margin-left: auto;  
  97.     width: 800px;  
  98.     margin-top: 30px;  
  99. }  
  100. .pagelist a{  
  101.     text-decoration:none;  
  102.     display:block;  
  103.     height:auto;  
  104.     width:auto;  
  105.     float:left;  
  106.     padding:1px 6px;  
  107.     color:#333;  
  108.     margin-right:5px;  
  109.     text-align:center;  
  110.     border:1px solid #CCC;  
  111. }  
  112. .pagelist a:hover{  
  113.     color:#F63;  
  114. }  
  115. .pagelist .alink{  
  116.     text-align:center;  
  117.     width:20px;  
  118. }  
  119. .pagelist strong{  
  120.     text-decoration:none;  
  121.     display:block;  
  122.       
  123.       
  124.     float:left;  
  125.       
  126.     text-align:center;  
  127.     width:20px;  
  128.     padding:1px 6px;  
  129.     border:1px solid #CCC;  
  130.     margin-right:5px;  
  131.     color:#FFF;  
  132.     background:#666;  
  133. }  
  134. .pagelist .sel{  
  135.     width:40px;  
  136. }  
  137. </style>  
  138. </head>  
  139.  
  140. <body>  
  141. <div class="top">  
  142. <!--下拉框固定焦点-->  
  143. <script>  
  144. <!--  
  145.     function fix(){  
  146.         //alert('ok!');  
  147.         document.getElementById('wangzhan').options.focus();  
  148.     }  
  149. //-->  
  150. </script>  
  151. <form method="get" action="tongji.php" style="margin-top:10px;" name='form1'>  
  152. 统计网站:<select name="wangzhan" id='wangzhan' onchange="fix()">  
  153.                 <option value="">--请选择--</option>  
  154.                 <option value="piaoliang" >漂亮网</option>  
  155.                 <option value="piaoliang_n" >漂亮网_频道</option>  
  156.                 <option value="bohe">薄荷网</option>  
  157.                 <option value="jianfen">减肥网</option>  
  158.                 <option value="tianqi">天气网</option>  
  159.                 <option value="nvsheng">女生网</option>              
  160.              </select>&nbsp;&nbsp;&nbsp;&nbsp;  
  161.     查询日期:  
  162.             <select name='YYYY' onChange="YYYYDD(this.value)">   
  163.             <option value="" selected='selected'>请选择 年</option>   
  164.             </select>   
  165.             <select name='MM' onChange="MMDD(this.value)">   
  166.             <option value="">选择 月</option>   
  167.             </select>   
  168.             <select name='DD'>   
  169.             <option value="">选择 日</option>   
  170.             </select>   
  171.  
  172.  
  173.     <input type="submit" value="查询" />  
  174. </form>  
  175. </div>  
  176. <table width="800"  align="center" cellpadding="0" cellspacing="0" style="margin-top:20px; border:1px solid #999;">  
  177.   <tr style="border:1px solid #999;">  
  178.     <td width="140" height="25" align="center" bgcolor="#999999" >统计网站</td>  
  179.     <td width="240" align="center" bgcolor="#999999">出站的连接</td>  
  180.     <td width="140" align="center" bgcolor="#999999">IP(独立)</td>  
  181.     <td width="140" align="center" bgcolor="#999999">PV</td>  
  182.     <td width="140" align="center" bgcolor="#999999">日期</td>  
  183.   </tr>  
  184. <?php foreach ( $resArr as $v ){  ?>  
  185.   <tr align="center">  
  186.     <td height="25" ><?php echo $v['sourceUrl'];?></td>  
  187.     <td><?php echo $v['aimUrl']?></td>  
  188.     <td><?php echo $v['ipSum']?></td>  
  189.     <td><?php echo $v['pvSum']?></td>  
  190.     <td><?php echo $v['date']?></td>  
  191.   </tr>  
  192.  <?php }?>  
  193. </table>  
  194. <div class="pagelist">  
  195.     <?php   
  196.     if$wangzhan != '' && isset($resArr[0])){  
  197.         echo $pageList->pre(); echo $pageList->first();echo $pageList->strList();   
  198.         echo $pageList->end();echo $pageList->next();  
  199.         echo "&nbsp;&nbsp;请选择跳转到第: ";echo $pageList->selectList().' 页';  
  200.     }  
  201.     ?>  
  202. </div>  
  203. <script language="JavaScript">  
  204. <!--   
  205. function YYYYMMDDstart()   
  206. {   
  207. MonHead = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];   
  208.  
  209. //先给年下拉框赋内容   
  210. var y = new Date().getFullYear();   
  211. for (var i = (y-3); i < (y+1); i++) //以今年为准,前30年,后30年   
  212. document.form1.YYYY.options.add(new Option(" "+ i +" 年", i));   
  213.  
  214. //赋月份的下拉框   
  215. for (var i = 1; i < 13; i++)  
  216.  if( i < 10 ){  
  217.      /*如果是小于10的数,则加上0和日期匹配,下面的天数是一样*/   
  218.     document.form1.MM.options.add(new Option("0" + i + " 月", i));  
  219.  }else{  
  220.     document.form1.MM.options.add(new Option("" + i + " 月", i));  
  221. }  
  222.  
  223. document.form1.YYYY.value = y;   
  224. document.form1.MM.value = new Date().getMonth() + 1;   
  225. var n = MonHead[new Date().getMonth()];   
  226. if (new Date().getMonth() ==1 && IsPinYear(YYYYvalue)) n++;   
  227. writeDay(n); //赋日期下拉框Author:meizz   
  228. document.form1.DD.value = new Date().getDate();   
  229. }   
  230. if(document.attachEvent)   
  231. window.attachEvent("onload", YYYYMMDDstart);   
  232. else   
  233. window.addEventListener('load', YYYYMMDDstart, false);   
  234. function YYYYDD(str) //年发生变化时日期发生变化(主要是判断闰平年)   
  235. {   
  236. var MMvalue = document.form1.MM.options[document.form1.MM.selectedIndex].value;   
  237. if (MMvalue == ""){ var e = document.form1.DD; optionsClear(e); return;}   
  238. var n = MonHead[MMvalue - 1];   
  239. if (MMvalue ==2 && IsPinYear(str)) n++;   
  240. writeDay(n)   
  241. }   
  242. function MMDD(str) //月发生变化时日期联动   
  243. {   
  244. var YYYYvalue = document.form1.YYYY.options[document.form1.YYYY.selectedIndex].value;  
  245.  if (YYYYvalue == ""){ var e = document.form1.DD; optionsClear(e); return;}   
  246. var n = MonHead[str - 1];   
  247. if (str ==2 && IsPinYear(YYYYvalue)) n++;   
  248. writeDay(n)   
  249. }   
  250. function writeDay(n) //据条件写日期的下拉框   
  251. {   
  252. var e = document.form1.DD; optionsClear(e);   
  253. for (var i=1; i<(n+1); i++)   
  254.  if( i < 10 ){  
  255.     e.options.add(new Option("0"+ i + " 日", i));   
  256.  }else{  
  257.     e.options.add(new Option(""+ i + " 日", i));    
  258.  }  
  259. }   
  260. function IsPinYear(year)//判断是否闰平年   
  261. return(0 == year%4 && (year%100 !=0 || year%400 == 0));}   
  262. function optionsClear(e)   
  263. {   
  264. e.options.length = 1;   
  265. }   
  266. //--></script>   
  267. </body>  
  268. </html> 

 

 最后还有就是数据库表的结构,这样只有一张表 在pv记录上还有一些小误差,因为这里主要是用 cookie控制的时间,所以有误差 如果有高手可以优化数据库设计用ip来控制,能力有限,望大家见谅:

 

  
  
  
  
  1. CREATE TABLE `dede_tongji` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `sourceUrl` varchar(255) NOT NULL, `aimUrl` varchar(255) NOT NULL, `ipSum` int(10) unsigned NOT NULL, `pvSum` int(10) unsigned NOT NULL, `datedate NOT NULL

 

你可能感兴趣的:(IP,pv,pv,php统计ip)