返回列表 發帖

網站計數器及線上人數製作

壹、程式說明
使用網頁應用程式進行資料庫數據統計,是十分重要的技巧,網站計數器正是呈現此一技巧。
我們在瀏覽網站時,大多會看到視窗上顯示此網站已經有多少人瀏覽過,目前正在瀏覽有幾人。此數據對於一個網站的經營者有很多的意義。第一瀏覽本站人數的多寡能讓站長知道其所製作的內容是否吸引人,網站的宣傳是否夠,是否要使用何種活動來增加瀏覽的人數。第二線上人數統計,能讓站長知道何種時段同時瀏覽人數最多,那一時段瀏覽人數最少。於是網站的經營者就能依照此數據來對網站的內容做一些調整。而此成長的數字對於製作網站也是一種正面、有效的助益。
為了讓同學更加瞭解httpd.conf的運作情況,因此使用apache別名來處理網站的問題。
Alias /count/ "C:/countsystem/"
<Directory "C:/countsystem">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
一、網站計數器及線上人數流程圖
image001.png
2011-6-7 08:11

二、程式原始檔的複製及MySQL資料庫匯入
mysql> SELECT PASSWORD("P@ssw0rd");
+-------------------------------------------+
| PASSWORD("P@ssw0rd")                      |
+-------------------------------------------+
| *8232A1298A49F710DBEE0B330C42EEC825D4190A |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT PASSWORD("123456");
+-------------------------------------------+
| PASSWORD("123456")                        |
+-------------------------------------------+
| *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> USE bruse
Database changed

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> \. C:\countsystem.sql

mysql> SELECT * FROM webcount;
+----------+-----------+---------------------+
| count_id | count_ip  | count_time          |
+----------+-----------+---------------------+
|        1 | 127.0.0.1 | 2008-08-28 10:06:34 |
|        2 | 127.0.0.1 | 2008-09-28 10:06:38 |
|        3 | 127.0.0.1 | 2008-09-28 10:06:40 |
|        4 | 127.0.0.1 | 2009-08-28 10:09:38 |
|        5 | 127.0.0.1 | 2009-09-28 10:10:06 |
|        6 | 127.0.0.1 | 2009-09-28 10:10:08 |

mysql> DESC webcount;
image002.png
2011-6-7 08:11
image003.jpg
2011-6-7 08:11

webcount資料表儲存的是計數器的資料,欄位命名都以count_為前置元。資料表以count_id(計數編號)為主索引,並設定為unsigned及auto_increment,如此即能在新增資料時,加上一個單獨的編號而不重複。
image004.png
2011-6-7 08:11

count_ip(訪客IP位址)是記錄主要欄位,即是由程式取得目前訪客的IP位置後,以字串型態儲存。count_time為記錄資料的時間,也就是訪客進入本站的時間,如此一來當訪客一進入網站時,就會馬上記錄訪客的IP位址及時間。此如計算方式比起傳統以文字記錄累計人數好的原因,除了可統計人數外,還可獲得每個瀏人的位址及造訪時間等附加資料。

貳、網站計數器的製作
首先要製作的網站計數器,我們可以發現只要可順利記錄,進入網站的訪客資料,在資料表及查詢的互動下,很容易完成計數器的製作。
一、定義網站
image005.jpg
2011-6-7 08:11
image006.jpg
2011-6-7 08:11

二、設定資料庫連線及修正連線校對
image008.jpg
2011-6-7 08:11
image010.png
2011-6-7 08:11
image011.jpg
2011-6-7 08:11

接著要修正程式頁面的連線校對設定,目前面的編碼為UTF-8。
mysql_query("SET NAMES utf8");
image013.jpg
2011-6-7 08:11

二、網站瀏覽人數製作
(一)繫結今日瀏覽人數的資料集
image015.jpg
2011-6-7 08:11
image017.jpg
2011-6-7 08:11

一般設定資料集預設是使用簡單模式,但此並不能解決所有程式的需求,例如需要多個篩選值、多個排序值,或需進行統計等動作,就須進入進階模式。
在webcount資料表中記錄瀏覽者登入時間的欄位為count_time。若可將今天的日期存入變數$cToday中,再與此欄位做比對,即可篩選出屬於今日瀏覽的資料。count_time的欄位格式datetime,而變數$cToday只有年月日的資料,因此可以設篩選值為:
WHERE count_time LIKE 'cToday%'
其中%為萬用字元,代表任何內容。$cToday是今天的日期,而cToday%即代表只要今日期任何的時間都符合篩選值,故此篩選值即可找出資料中記錄時間為今天的所有資料,接著要馬上在DW4設定此資料集。
image019.jpg
2011-6-7 08:11

image021.jpg
2011-6-7 08:11

在此定義$cToday此變數預設值為date("Y-m-d"),如此一來會顯示今天的日期成為此變數的預設值。執行階段值在此沒有意義,可以隨意填。
雖然此設定在原理上並沒有錯誤,但因Dreamweaver會再修此變數的內容,我們要切換到程式碼編模式進行調整。
image023.jpg
2011-6-7 08:11
image025.jpg
2011-6-7 08:11

(二)繫結本月瀏覽人數資料集
image028.jpg
2011-6-7 08:11
image030.jpg
2011-6-7 08:11
image033.jpg
2011-6-7 08:11

在此定義$cThisMonth此變數預設值為date("Y-m")函數,如此一來會顯示目前的月份成為此變數的預設值。執行階段預設值在此沒有意義,可以隨意填。
雖然此設定在原理上並沒有錯誤,但因Dreamweaver會再修此變數的內容,我們要切換到程式碼編模式進行調整。
image035.jpg
2011-6-7 08:11
image038.jpg
2011-6-7 08:11

(三)繫結今年瀏覽人數資料
image041.jpg
2011-6-7 08:11
image042.jpg
2011-6-7 08:11
image044.jpg
2011-6-7 08:11

在此定義$ cThisYear此變數預設值為date("Y")函數,如此一來會顯示目前的月份成為此變數的預設值。執行階段預設值在此沒有意義,可以隨意填。
雖然此設定在原理上並沒有錯誤,但因Dreamweaver會再修此變數的內容,我們要切換到程式碼編模式進行調整。
image046.jpg
2011-6-7 08:11
image049.jpg
2011-6-7 08:11

(四)繫結瀏覽總人數資料集
image050.jpg
2011-6-7 08:11

(五)插入統計結果欄位
image053.jpg
2011-6-7 08:11

image055.png
2011-6-7 08:11

image059.png
2011-6-7 08:11


image060.png
2011-6-7 08:11

image061.png
2011-6-7 08:11

三、記錄訪客的位址及時間
除了顯示瀏覽人數及本日瀏覽人數之外,本頁最大功能應是要在開啟的同時將瀏覽人的位址及時間記錄到資料表中,才能供資料表統計顯示資料。
(一)取得訪客位址及時間方法
在PHP中擷取目前系統時間較為容易,如下我們將目前佔存一個變數中。
$nowtime=date("Y-m-d H:i:s");
但是要如何取得訪客的位址,在PHP可使用語法取得訪客的資訊,其取得瀏覽者位址儲存在一個變數的方法如:
$userIP=$_SERVER['REMOTE_ADDR'];
(二)新增資料SQL陳述式
使用SQL的語法來新增資料,其語法:
INSERT INTO 資料表名稱(欄位名稱1, 欄位名稱2,…)
VALUES(插入資料值1, 插入資料值2,…)
因此我們可以將此資料插入的SQL陳述式修改為
INSERT INTO webcount (count_id, count_ip, count_time)
VALUES(NULL, '$nowtime ', '$userIP ');
四、防止瀏覽人數灌水
在加入計數指令後只要有瀏覽者進入此頁面,即會執行命令增加瀏覽人,因此只要多重整此頁面,即會讓瀏覽人數直接增加,其實此問題也不一定要解決,因為瀏人數越多,會增加網站的吸引力,當然也可以滿足站長的虛榮心,若立是如此,灌水當然是好的。
但若要確實掌握網站瀏覽的人數,以確定網站內容的方向與規劃,防止此漏洞,當然有助於網站的成長。
(一)何謂SESSION
在此我們要使用SESSION功能來解決此問題。SESSION是瀏覽者與伺服器連線工作期間所保持的狀態,其使用的時間是在開啟瀏覽器後進入啟動SESSION機制的網站開始,無論其中是否瀏覽同網站的其他頁面,甚至離開該網站到別的網站或頁面,只要瀏覽器沒有關閉,回到原網站時,會發現原來的SESSION仍然有效。
也就是若使用程式將一個變數記錄到SESSION中,當瀏覽者不關閉瀏覽器,在同一個頁面上重新整理時,該SESSION值都會一直存在。只要程式接收到此SESSION值,就不會執行計次功能,即可規避掉灌水問題。
(二)加入SESSION值
在PHP使用SESSION,我們可以使用session_start()函數來啟動SESSION功能,再利用下面的方式宣告:
session_start();          //啟動SESSION功能
$_SESSION['名稱']=值;  //設定SESSION變數及預設值
接下來要在計次的程式碼前加入一個SESSION值,以供重新整理頁面時,其語法為:
session_start();
if(!isset($_SESSION['Counter'])){
     //執行計算功能
$_SESSION['Counter']=1
}
在此我們要說明此段程式碼的意義:在啟動SESSION後,程式判斷某個SESSION值是否存在,若不存在即執行計算功能,反之則跳過計算功能。在若是執行計算功能後,程式會自動設立一個SESSION值,讓下次要執行計算功能前檢查。
(三)加入計次程式碼與SESSION判斷
我們來設定此SQL陳述式(SQL.TXT),將相關的程式碼加入到網頁的最上方:
<?php
$nowtime=date("Y-m-d H:i:s");                                         //設定代表目前時間的變數
session_start();                                                                 //啟動Session的使用
if(!isset($_SESSION['Counter'])){                                 //檢查Session值是否存在
        mysql_select_db($database_connSQL, $connSQL);        //連結資料庫
        $userIP=$_SERVER['REMOTE_ADDR'];                         //收集瀏覽者的IP
        $insertCommand="INSERT INTO webcount (count_ip,count_time)
                VALUES ('$userIP', '$nowtime')";         //新增資料的SQL字串
        mysql_query($insertCommand,$connSQL);         //執行webcount資料庫的新增
        $_SESSION['Counter'] = 1;                                          //設定Session值
}
?>
image063.jpg
2011-6-7 08:11

如此即完成網站計數器頁面index.php製作。

參、線上人數製作
Dreamweaver快速方便,但不是萬能的。有許多程式的功能並不能直接在原來的功中完成操作,在忑我們要自製伺服器行,將一些Dreamweaver沒有提供的程式功能增加,以提昇程式的功能。
一、為何要自製伺服器行為
我們會發現Dreamweaver在網頁上呈現互動的功能,完全是與後端資料庫配合的成果,但其並沒有提供其他方法來記錄資料,如線上人數,我們須要使用到PHP將資料寫入文字檔中,但Dreamweaver找不到一個可以操作的功能。
只要有些Dreamweaver不足的地方,我們可以安裝一些擴充程式來完成,但我們要如何自製一個伺服器行為,只要遇到有相同的需要的頁面,只要執行這個自製的伺服器行即能解決此問題。
二、新增伺服器行為:PHP線上人數
其實在網路上找到許多好用的線上人數PHP程式,但一旦要引用又要貼來貼去十分麻煩,此時我們可以包裝到Dreamweaver的伺服器行為中使用,讓我們的Dreamweaver與人不同。
(一)PHP線上人數原始碼
在資料夾中可以找到onlineuser.txt,其中有一個常見的線上人數PHP原始碼:
1、程式碼一:計算線上人數
<?php
$timesec=gettimeofday();
$tmp=file("time.txt");
if ($tmp[0]==""){
  $fopen0=fopen("time.txt","w+");
  fputs($fopen0,$timesec["sec"]);
  fclose($fopen0);
  $fopen1=fopen("ip.txt","w+");
  fputs($fopen1,"");
  fclose($fopen1);
}
$tmp1=file("time.txt");
$equal=($timesec["sec"]-$tmp1[0]);
if ($equal>60){
  $fopen0=fopen("time.txt","w+");
  fputs($fopen0,"");
  fclose($fopen0);
}
$fopen=fopen("ip.txt","a+");
$ip=$ _SERVER['REMOTE_ADDR'];
$flag=1;
$tmp2=file("ip.txt");
$con=count($tmp2);
for ($i=0;$i<$con;$i++){
  if ($ip."\n"==$tmp2[$i]){
    $flag=0;
    break;
  }
}
if ($flag==1){
  $ipstring=$ip."\n";
  fputs($fopen,$ipstring);
}
fclose($fopen);
$tmp3=file("ip.txt");
$onlineusr=count($tmp3);
?>
此段程式可以參考相關其他的寫法。此段程式碼其主要是計算有多少個不同的IP正在使用瀏覽器閱讀此網頁,並將IP資料儲存到ip.txt檔案中,最後只要計算檔案中的IP的數量,即可以得知線上有多少人。而此段程式須放置在網頁剛開始的位址。
2、程式碼二:執行網頁重整
<?php echo "<meta http-equiv=\"Refresh\" content=\"30\" />";?>
主要功能是設定頁面重新整理時間,在此段程式須加在<header>標籤中,我們也可以使用PHP的header()函數來處理。
3、程式碼三:顯示線上人數
<?php echo $onlineusr;?>
主要是顯示結果,此段程式是放置顯示線上人數的地方。
(二)新增伺服器行為
image066.jpg
2011-6-7 08:11

image067.jpg
2011-6-7 08:11

接下來我們就要由onlineuser.txt中複製程式碼來加入
image069.jpg
2011-6-7 08:11
image071.jpg
2011-6-7 08:11
image074.jpg
2011-6-7 08:12
image075.jpg
2011-6-7 08:12
image079.jpg
2011-6-7 08:12
image080.jpg
2011-6-7 08:12
image087.jpg
2011-6-7 08:12
image089.jpg
2011-6-7 08:12
image090.jpg
2011-6-7 08:12

如此即完成PHP線上使用者人數的伺服器行為製作。
三、自製伺服器行為的使用

image091.jpg
2011-6-7 08:12
image092.jpg
2011-6-7 08:12
image093.jpg
2011-6-7 08:12

如此即完成線上人數的製作,按F12即可顯示相關的資訊。
image094.jpg
2011-6-7 08:12

肆、顯示訪客位址資料頁製作
我們製作的計數器是記錄最新10個瀏覽器訪客的位址資料與瀏覽時間,然後再統計出來的結果。
一、繫結資料集
image095.jpg
2011-6-7 08:12
image096.jpg
2011-6-7 08:12

二、佈置顯示欄位與設定重複區域
image097.jpg
2011-6-7 08:12
image098.jpg
2011-6-7 08:12
image099.jpg
2011-6-7 08:12

接著設定重複區域
image100.jpg
2011-6-7 08:12
image101.jpg
2011-6-7 08:12

因在設計上,我們只要求顯示目前最新的10筆記錄,若有多於10筆以上的記錄就看不到了,不需加入資料導覽列來翻頁。
image102.jpg
2011-6-7 08:12
image103.jpg
2011-6-7 08:12

伍、網站計數器及線上人數成品



PHP實現線上人數統計
前幾天發現看到了線上人數統計的自訂欄位,用了一天的時間完成這個簡易的線上人數統計,前幾篇文章中所講到的隨機驗證圖功能,正好可以套入這次的線上人數統計中,首先先在資料庫中建立資料表
CREATE TABLE `counter` (
  `hash` char(32) NOT NULL,
  `ip` varchar(15) NOT NULL,
  `time` int(11) NOT NULL,
  PRIMARY KEY  (`time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ps. IP欄位可有可無
線上人數的程式碼不包含製作圖片Function
<?php
session_start();
$time = time();
//建立連線
$objConn = mysqli_connect("localhost", "帳號", "密碼",'資料庫',port) or die('資料庫無法連線');

// 檢查session是否有值
if(!isset($_SESSION["hash"]))
{
    //使用ip加現在時間作 MD5 hash code
    $hash = md5($_SERVER['REMOTE_ADDR'].$time);
    session_register("hash");
    $_SESSION["hash"] = $hash;
}
// 檢查資料庫中是否有hash  code
$query = mysqli_query($objConn,"select hash from `counter` where (hash='".$_SESSION["hash"]."')");
if($rows = mysqli_fetch_row($query))
{
    //有,更新最後在線時間
    mysqli_query($objConn,"update `counter` set `time`='".$time."' where hash='".$_SESSION["hash"]."'");
}
else
{
    //無,新增一筆 hash code
    mysqli_query($objConn,"insert into `counter` values('".$_SESSION["hash"]."', '".$_SERVER["REMOTE_ADDR"]."', '".$time."')");
}
$intOnlineTime = $time - 300; //五分鐘內活動視為在線
$query = mysqli_query($objConn,"select count(time) from `counter`");
$objOnlineCount = mysqli_fetch_row($query);

// 清除逾時的資料
mysqli_query($objConn,"delete from `counter` where (`time` < '".$intOnlineTime."')");
//製作圖片,請參考前幾篇文章的資料,function內的參數需要修改圖片顯示才會正確
makeRandomImage('Online User : '.$objOnlineCount[0],100,20);
?>
簡單就完了線上人數的統計,只要將程式放至伺服器,在部落格中新增一欄自訂欄位後,將程式在網路上的位置填寫完即可,<img src='程式路徑' border='0'/>,部落格中已將加入實際成品
l

返回列表
清潔公司-到府打掃-洗潔服務-家庭清潔公司-居家清潔公司-打掃服務-居家清潔-家庭清潔服務
446