計數器是讓 web 訪客知道該網頁或者網站的人氣指數最直接的方法,同時,訪客人數也是給廣告商做廣告的最好依據。雖然很多網站都提供免費的計數器,可畢竟不是自己親手制作的,不能體現出自己的特色。下面就php環境下記數器的制作過程進行詳細的討論。
訪客計數器的流程如下:
第一位使用者瀏覽某頁。
服務器程式從資料庫或檔案中讀取該頁被瀏覽次數。
將次數加一儲存,并將它送回第一位使用者。
下一位使用者瀏覽某頁。
服務器程式從資料庫或檔案中讀取該頁被瀏覽次數。
將次數再加一儲存,并將它送回下一位使用者。
php中沒有直接的計數器函數,但利用它強大的功能,我們可以很容易地自己編寫一個計數器。計數器的實現分為兩個階段:一是實現計數;二是實現數字的顯示。在實現計數時又有兩種方式:一是基于文件的計數方式;二是基于數據庫的計數方式。同樣在實現數字的顯示上也有兩種方式:一是普通的文本顯示;二是圖形方式顯示。下面就分別將這四種情況作一一介紹.
一、計數的實現
1.基于文件的計數
原理:把以往的訪問人數記錄在一個文本文件中,當網頁被訪問的時候,打開該文件并從中讀出以往的訪問人數,加 1,得到最新的訪問人數,再把最新的訪問數字回寫到紀錄訪問人數的文件中。
實現;
<?php
$counterfile = "counter.txt";
if (!file_exists($counterfile)) {
//判斷文件是否存在
$fp = fopen($counterfile, "w");
fputs($fp, "0");
fclose($fp);
}
//讀文件
$n=10;
$fp = fopen($counterfile, "r");
$str1 = fgets($fp,$n);
$str1++;
fclose($fp);
//回寫文件
$fp = fopen($counterfile, "w");
fputs($fp, $str1);
fclose($fp);
?>
程序說明:在瀏覽到本頁時,php 程式先找尋 counter.txt 文件是否存在,若不存在,則建立一個 counter.txt 文件,并將 0 寫入文件。然后讀取 counter.txt 文件的內容,并將讀出的數字加一,然后回寫到文件中。
2、基于數據庫的計數
原理:把訪問人數記錄在一個數據庫中,當網頁被訪問的時候,從數據庫中讀出以往的訪問人數,加 1,得到最新的訪問人數,再把最新的訪問數字回寫到數據庫中。
實現:假設數據庫為mysql數據庫,名為xinxiku,先建一數據表count,表字段中僅有counter一個字段,默認值為0,來記錄訪問人數。
<?php
//連接數據
$db=mysql_connect("localhost","root","");
mysql_select_db("xinxiku",$db);
//更新訪問人數
$result=mysql_query("update count set counter=counter+1",$db);
?>
程序說明:訪問者在瀏覽到本頁時,首先連接到數據庫,并把記數字段用原值加1來進行更新操作,實現訪問數的遞增。
二、記數的顯示
1、普通的文本方式顯示
這種顯示方法很簡單,在需要顯示記數的地方直接輸出即可。以上面的例子分別說明:
基于文件的計數,直接輸出變量str1的內容即可。
<?php echo $str1 ; ?>
基于數據庫的計數,首先從數據庫中讀出,然后再輸出。
<?php
//查詢數據庫
$sql="select * from count";
$result=mysql_query($sql,$db);
//取得記錄集
$record=mysql_fetch_array($result);
//取得訪問人數
$str1=$record["counter"];
echo $str1;
?>
同樣,你也可以用html語句像 <font color size>等對輸出的數字進行修飾。文本顯示的優點是減少下載時間,瀏覽速度快。缺點是顯示方式不夠活潑。
2、圖形方式顯示
原理:把讀出的訪問數據格式化成標準的格式,然后利用php提供的圖像處理函數,把數字輸出成圖片格式。這樣,數字的顯示格式可以隨意控制,真正能體現出自己的特色來。
實現:
<?
header("content-type: image/gif");
//定義輸出為圖像類型
$n=10;
//變量$n是顯示位數
//利用上面的方法,取得訪問人數并賦值給變量$str1 (程序略)
$str1=取得訪問人數的值
$str2 = "";
//位數如果不夠$n位,在前面補0
$len1 = strlen($str1);
for ($i=1;$i<=$n;$i++) {
$str2 = "0".$str2;
};
//得到$n位0
$len2 = strlen($str2);
//計算訪問人數的位數
$dif = $len2 - $len1;
$rest = substr($str2, 0, $dif);
$string = $rest.$str1;
//位數如果不夠$n位,在前面補0
for ($i=0;$i<=$n-1;$i++) {
$str[$i]=substr($string,$i,1);
};
//以數組存儲每位數字
$font = 4;
//定義字號
$im = imagecreate($n*11-1,16);
//新建圖象
$black = imagecolorallocate($im, 0,0,0);
$white = imagecolorallocate($im, 255,255,255);
//定義顏色
imagefill($im, 0,0,$black);
//把計數器的底色設置成黑色
imagestring($im,$font,1,0,$str[0],$white);
for ($i=1;$i<=$n-1;$i++) {
imageline($im, $i*11-1,0,$i*11-1,16, $white);
imagestring($im,$font,$i*11+1,0,$str[$i],$white);
};
//將每位寫入圖象,并以豎線分隔
imagegif($im);
//圖象輸出
imagedestroy($im);
//釋放圖象
?>
輸出圖形如圖如示:
函數說明:
imagecreate(int x_size, int y_size):建立一張全空的圖形。參數 x_size、y_size 為圖形的尺寸,單位為像素 (pixel)。
imagecolorallocate(int im, int red, int green, int blue):用來匹配圖形的顏色,供其它繪圖函數使用。參數 im 表示圖形的 handle。參數 red、green、blue 是色彩三原色,其值從 0 至 255。
imagefill(int im, int x, int y, int col):將圖片坐標 (x,y) 所在的區域著色。參數 col 表示欲涂上的顏色。
imagestring(int im, int font, int x, int y, string s, int col):在圖片上繪出水平的橫式字符串。參數 font 為字形,設為 1 到 5 表示使用默認字形。參數 x、y 為字符串起點坐標。字符串的內容放在參數 s 上。參數 col 表示字符串的顏色。
imageline(int im, int x1, int y1, int x2, int y2, int col):在圖形上畫出一條實線。從 x1、y1 連接到 x2、y2,原點 (0,0) 為圖形的左上角。參數 col 為實線的顏色。
imagegif(int im, string [filename]):建立一張 gif 格式圖形。參數 im 為使用 imagecreate() 所建立的圖片代碼。
imagedestroy(int im):將圖片 handle 解構,釋于內存空間。
三、結束語
1、上述代碼如果直接放在文件頭,那么只要有人訪問該頁,無論是刷新還是從網站的其它頁跳轉到該頁,就會使計數值加1,從而使主頁計數失去了真實性。有兩個很簡單的辦法可以解決。
a、在返回到該頁的鏈接上傳遞一個參數flag,比如:index.php?flag=1,在計數之前首先檢查flag變量是否已賦值,若未賦值,計數器加1。否則不加。
if(empty($flag)){
$counter+=1;
}
b、用session記錄一標志flag,在記數前先判斷flag是否已賦值,如果沒賦值,則記數加1,并給flag賦值,否則,記數器不變。
if (!isset($flag))
{
//處理記數器加1語句
...
//賦值flag
session_start();
session_register("flag");
$flag=1;
}
2、為了方便,可以將計數器作為一個函數mycounter(),這樣只許需在主頁開頭加入require("filename"); 使mycounter()成為此主頁的一部分,需要的時候,將<? mycounter();?>加在需要計數器的地方顯示就可以了。
3、利用圖形顯示計數器時,在需要的地方直接插入:<img src="counter.php" border=0>即可。但要注意的是php中必須安裝gd庫才能利用php中的圖像處理函數。