| 經驗交流 |
|
|---|---|
|
製作訪客人數統計圖 | |
問題說明 | |
| 在本站首頁有個「本月訪客人數統計圖」(如下圖),可以將本月份的受訪狀況以長條圖的形式展現。 | |
|
| |
| 該圖啟用近一年來,有些訪客對它感到興趣,紛紛來信索取程式碼。為了方便對方閱讀,每次回信時,我都得長篇大論詳加說明;為了杜絕「後患」,我將整個程式的內容說明如下,請有興趣的朋友自行瀏覽吧! | |
我的做法 | |
| 您的 PHP 已經安裝 GD Lib 了嗎?要是沒有它,以下的程式就沒效果了。 | |
| 我分為以下幾個步驟,逐步畫出這個統計圖: | |
| 一、計算本月份的天數: | |
| 先取得目前的年份與月份資料,再算出本月份應有的天數。 | |
| 二、自資料庫中取得本月份各天的訪客人數: | |
| 我建立一個名為 traffic 的資料表,其中只有一個欄位(visit_time,char(12)),用來記錄每個訪客的來訪時間。 | |
| 在從資料庫讀取資料時,我使用 GROUP BY 的語法,將資料以天為單位,用「日期,人數」的形式取出,如:(20030701,150), (20030702,415), ......。 | |
|
<? $sql = "select substring(visit_time, 1, 8) as D, count(*) from traffic "; $sql .= "where substring(visit_time, 1, 6) = '" . $this_Y . $this_M . "' "; $sql .= "group by D order by D "; ?> | |
| 若當月尚無訪客資料時,則顯示一個寫著「No New Visitor」的圖。既然有人看到統計圖了,他不就是訪客了嗎?怎麼可能當月沒有訪客資料呢?您或許會這麼質疑我的說法。 | |
| 因為我只在每位訪客初入本站時計次,接下來無論他瀏覽多少頁面都不被記錄,以免訪客統計值太過浮濫。因此,如果某人在 6 月 30 日 23:59:59 前到站,當時間進入 7 月 1 日時,他在首頁上很可能看不到任何當月份的訪客資料,因為 7 月份還沒有「新訪客」來到。 | |
| 在取得當月份訪客人數資料後,我將它們存入陣列之中,同時找出當月最大的人數值,以便決定統計圖左側的刻度大小。 | |
|
<? $MAX = 0; for ( $i=0; $i<$nT; $i++ ) { list($Guest[$i][0], $Guest[$i][1]) = mysql_fetch_row($rs); if ( $Guest[$i][1] > $MAX ) $MAX = $Guest[$i][1]; } ?> | |
| 三、設定繪製統計圖的相關參數: | |
| 相關參數包括統計圖四周保留的空白區域大小、垂直方向的刻度數、垂直方向的最大刻度、格線之寬度與高度、長條寬度與格線寬度之比例,整個圖形的總寬度與總高度、圖形顏色與圖檔格式等等。 | |
| 四、繪製統計圖: | |
| 先以指定的底色填滿整張圖,再藉 ImageGrid( ) 函數畫上格線,然後將各日的到訪人數一一畫出來,最後再將左側與下方的刻度文字填入。 | |
| 在填寫下方刻度時,由於圖形寬度可能不足,所以我使用 ImageStringUp( ) 函數,以便將文字轉 90 度呈現。 | |
| 在繪圖完成之後,將圖檔輸出給瀏覽器,並釋放繪圖過程所佔用的記憶體空間。 | |
|
| |
|
| |
| 由於我並沒有打算開放使用者查詢過去的訪客統計圖,所以在程式中不接受外來的參數。若您想看看訪客歷史紀錄的話,可以自行修改程式,將年份與月份以參數的方式傳入即可。 | |
| 雖然我使用 Session 控制來辨識初到的訪客,而且只針對這些人記錄其到站時間,以便瞭解真實的訪客人數;不過當某些人為了能夠離線瀏覽,而使用「砍站」軟體造訪本站時,Session 控制就起不了作用了。 | |
| 除了研習課程進行的那幾天之外,如果您看到統計圖有異常的高峰,那就表示本站在當天又被「砍」了。 | |
| 其實我可以視同一 IP 對本站瀏覽的密集程度,來區分哪些人是正常瀏覽,而哪些人是在「砍」我的站,並且進一步阻擋其行為。不過,這種行為除了讓訪客統計失真以外,並沒有對我個人造成什麼困擾,所以我不打算進行任何的反制行動。 | |
| 2003.7.8 | |
| 經驗交流 |
|


問題說明