Đặt Bộ đếm trên trang Web
Thật là điều tự nhiên, ngay khi đưa trang web đầu tiên của mình lên Internet, bạn đã muốn biết
có bao nhiêu người sẽ đến đọc trang web đó. Cũng như bạn, tôi đã từng sử dụng khá nhiều
những bộ đếm (counter) miễn phí. Nhưng rồi không bằng lòng với những gì được cho không,
cộng với chút công sức tìm hiểu, tôi đã tìm ra được cách làm bộ đếm cho mình.
Vì bộ đếm này được viết bằng PHP nên điều kiện để bộ đếm hoạt động được là website của bạn
phải hỗ trợ PHP. Nếu bạn muốn lưu giữ website miễn phí thì đây là một số nhà cung cấp dịch vụ
lưu website có hỗ trợ PHP: www.cbj.net, www.lycos.co.uk, www.sourceforge.net, …
Sau đây là hướng dẫn nhanh để bạn có được bộ đếm trên trang web của mình.
Bước 1: Mở tệp web muốn đặt bộ đếm bằng một trình soạn thảo văn bản như Notepad, EditPlus,
UltraEdit. Mã HTML trang web của bạn sẽ hiện lên trong trình soạn thảo.
Bước 2: Tìm đến vị trị bạn muốn hiện bộ đếm, và dán đoạn mã PHP dưới đây vào:
<?
$CountFile = "index.log";
$CF = fopen ($CountFile, "r");
$Hits = fread ($CF, filesize ($CountFile));
fclose ($CF);
$Hits++;
$CF = fopen ($CountFile, "w");
fwrite ($CF, $Hits);
fclose ($CF);
echo ($Hits);
?>
Bước 3: Lưu tệp. Nếu tệp có phần mở rộng là .htm thì đổi tên sang .php. Ví dụ index.htm thì đổi
thành index.php. Có vậy thì server mới hiểu và thi hành đoạn mã để hiện bộ đếm.
Bước 4: Tạo một tệp văn b
ản có tên index.log để lưu giá trị đếm. Nội dung tệp này là một con số
bất kỳ mà bạn muốn bắt đầu cho bộ đếm của mình (ta hãy bắt đầu bằng con số 0). Nhớ đừng
thêm dấu cách, Enter hay một ký tự nào khác ngoài con số trên.
Bước 5: Upload tệp web chứa bộ đếm (index.php) và tệp index.log lên website của bạn. Và nhớ
đặt thuộc tính cho tệp index.log là writable bằng lệnh chmod 777.
Bây giờ, hãy đánh địa chỉ tệp web của mình trong trình duyệ
t, bạn sẽ thấy trang web hiện lên
cùng với bộ đếm. Mỗi lần bạn nhấn nút Refresh thì bộ đếm lại tăng lên 1 đơn vị.
***
Nay ta hãy nhìn sâu vào đoạn mã PHP một chút. Nguyên lý chung của các bộ đếm là lưu giá trị
đếm vào một tệp riêng, mỗi lần có người truy cập đến tệp web thì sẽ đọc giá trị lưu trong tệp
đếm, tăng thêm 1, ghi lại vào tệp đếm và hiện giá trị đó lên màn hình.
Trước hết, ta cần cho chương trình biết giá trị đếm được lưu ở đâu, hay nói cách khác, tên tệp lưu
giá trị đếm là gì:
$CountFile = "index.log";
Dùng các hàm xử lý tệp do PHP cung cấp, ta lầ
n lượt mở tệp ở chế độ đọc ("r" có nghĩa là
"reading") và gán con trỏ tệp cho biến $CF:
$CF = fopen ($CountFile, "r");
đọc toàn bộ nội dung tệp và lưu vào biến $Hits:
$Hits = fread ($CF, filesize ($CountFile));
và đóng tệp lại sau khi đọc xong:
fclose ($CF);
Giá trị đếm hiện tại đã được lưu ở biến $Hits, giờ ta tăng biến này thêm 1 để chỉ rằng đã có thêm
một người nữa truy cập trang web:
$Hits++;
Các bước tiếp theo cũng tương tự như ở
trên. Ta mở tệp ở chế độ ghi ("w" có nghĩa là "writing"),
ghi lại biến $Hits (đã tăng thêm 1 so với trước) và đóng tệp sau khi ghi xong:
$CF = fopen ($CountFile, "w");
fwrite ($CF, $Hits);
fclose ($CF);
Việc cuối cùng là ta hiện giá trị đếm lên màn hình:
echo ($Hits);
Giá trị đếm này hiện lên ở chế độ văn bản, sử dụng đúng loại font mà bạn đang dùng trong trang
web. Nếu bạn muốn thay đổi kiểu chữ, cỡ chữ, màu sắc để làm nổi bật bộ đếm, bạn có thể sử
dụng thẻ <FONT> trong mã HTML để làm điều này.
***
Bạn chắc cũng chưa thoả mãn với bộ đếm ở dạng văn bản mà muốn bộ đếm được thể hiện ở
dạng đồ hoạ, giống như ở các trang web chuyên nghiệp khác. Việc này không khó. Bạn cần có
thêm các tệp ảnh (dạng .gif hoặc .jpg) chứa các con số từ 0 đến 9. Bạn có thể tải về
nhiều tệp ảnh
với các hình dạng con số khác nhau tại Digitmania. Giả sử các tệp ảnh này có tên lần lượt là
0.gif, 1.gif, … 9.gif - mỗi tệp tương ứng với một con số, và các tệp ảnh này đều lưu ở cùng thư
mục với tệp index.php trên server.
Đoạn mã PHP trong tệp index.php sẽ như sau:
<?
$CountFile = "index.log";
$CF = fopen ($CountFile, "r");
$Hits = fread ($CF, filesize ($CountFile));
fclose ($CF);
$Hits++;
$CF = fopen ($CountFile, "w");
fwrite ($CF, $Hits);
fclose ($CF);
for ($i = 0; $i < strlen($Hits); $i++)
{
$Digit = substr ($Hits, $i ,1);
echo "<IMG SRC = \"$Digit.gif\">";
}
?>
Bạn thấy là những dòng đầu hoàn toàn giống như trước. Sự khác nhau chỉ bắt đầu ở dòng cuối
cùng. Thay vì dòng lệnh echo ($Hits); ta dùng vòng lặp for để lần lượt tách từng con số trong giá
trị đếm và lưu tạm vào một biến gọi là $Digit:
$Digit = substr ($Hits, $i ,1);
sau đó ta sẽ dùng thẻ <IMG> của HTML để chỉ ra các tệp ảnh nào ta muốn hiện tương ứng với
từng con số trong giá trị đếm:
echo "<IMG SRC = \"$Digit.gif\">";
Ví dụ giá trị đếm lưu trong biến $Hits là 865. Giá trị này gồm 3 chữ số nên vòng lặp for sẽ được
thực hiện 3 lần. Tại lần thứ nhất, biến $Digit sẽ được gán với con số thứ nhất, tức là bằng 8. Lần
thứ hai và thứ ba, biến $Digit sẽ lần lượt nhận giá trị là 6 và 5. Kết quả là trang web index.php
khi xuất hiện trong trình duyệt của người dùng sẽ có mã HTML thực tế là:
<IMG SRC="8.gif"><IMG SRC="6.gif"><IMG SRC="5.gif">
và trình duyệt sẽ hiệ
n lên 3 tệp ảnh tương ứng với các con số 8, 6, 5, tạo thành một dãy số hoàn
chỉnh là số lần trang web đã được truy cập.
***
Câu hỏi cuối cùng đặt ra: Làm thế nào để đặt bộ đếm trên nhiều trang web khác nhau mà mỗi
trang không phải lặp lại đoạn mã trên nữa? Cũng như nhiều ngôn ngữ lập trình khác, PHP cho
phép người dùng tạo ra các hàm xử lý riêng và đặt các hàm này ở một tệp riêng để giảm bớt
chiều dài cho tệ
p chính. Tệp chứa các hàm riêng như vậy gọi là tệp thư viện.
Vận dụng khả năng trên, ta đặt toàn bộ đoạn mã bộ đếm vào một hàm gọi là Counter và đặt hàm
này vào một tệp thư viện có tên là ezcount.php. Hãy nhìn vào nội dung của tệp ezcount.php này
là gì:
<?php
function Counter ($CountFile, $Text, $ImgPath, $ImgType)
{
$CF = fopen ($CountFile, "r");
$Hits = fread ($CF, filesize ($CountFile));
fclose ($CF);
$Hits++;
$CF = fopen ($CountFile, "w");
fwrite ($CF, $Hits);
fclose ($CF);
if ($Text)
{
echo ($Hits);
}
else
{
for ($i = 0; $i < strlen($Hits); $i++)
{
$Digit = substr ($Hits, $i ,1);
echo "<IMG SRC =\"$ImgPath/" . $Digit . "$ImgType\">";
}
}
}
?>
Ta dễ dàng nhận thấy nội dung chính của tệp ezcount.php cũng giống như đoạn mã mà ta đã biết.
Nhưng ở đây có một số điểm mới nhằm giúp đoạn mã được sử dụng linh hoạt hơn. Hãy nhìn vào
dòng đầu tiên của hàm:
function Counter ($CountFile, $Text, $ImgPath, $ImgType)
Dòng này chỉ ra hàm của chúng ta có tên là Counter và có 4 giá trị đầu vào, hay còn gọi là 4
tham số.
• Tham số thứ nhất $CountFile chỉ ra tên tệp lưu giá trị đếm. Với mỗi tệp web, ta cần có một tệp
lưu giá trị đếm nên ta cần phải chỉ rõ tên tệp lưu giá trị đếm này khi gọi hàm để tránh ghi nhầm
vào tệp lưu giá trị đếm khác.
• Vì có lúc ta muốn dùng bộ đếm dạng văn bản, có lúc lại muốn dùng bộ đếm dạng đồ hoạ nên ta
cần có một tham số $Text có tác dụng như nút chuyển giữa hai dạng này. Nếu muốn thể hiện bộ
đếm dạng văn bản, khi gọi hàm ta đặt tham số này bằng 1, còn với bộ đếm dạng đồ hoạ, tham số
này cần đặt bằng 0.
• Tham số thứ ba $ImgPath chỉ ra đường dẫn thư mục lưu các tệp ảnh chứa con số. Vì tệp web
chứa bộ đếm có thể không nằm cùng thư mục với các tệp ảnh chứa con số nên ta cần có đường
dẫn này để tìm đến đúng n
ơi chứa các tệp ảnh.
• Tham số thứ tư $ImgType chỉ ra loại tệp ảnh, được thể hiện bằng phần mở rộng của tệp là
".gif" hoặc ".jpg".
Giờ ta nhìn vào đoạn cuối của hàm. Đây là nơi xử lý cụ thể việc lựa chọn giữa bộ đếm dạng văn
bản và dạng đồ hoạ. Ý nghĩa của biểu thức if … else ở đây là: Nếu biến $Text bằng 1, sẽ thi hành
mã lệnh echo ($Hits); để hiện bộ đếm dạng văn bản, còn nếu không (khi biến $Text bằng 0) sẽ
thi hành đoạn mã để hiện bộ đếm dạng đồ hoạ.
Khi chọn sử dụng bộ đếm dạng đồ hoạ, các tham số $ImgPath và $ImgType trong dòng lệnh
echo "<IMG SRC =\"$ImgPath/" . $Digit . "$ImgType\">"; sẽ được thay bằng nội dung cụ thể
khi gọi hàm.
Để sử dụng hàm Counter, trong tệp web đặt bộ đếm (index.php) ta chỉ cần đặt những dòng sau:
<?php
include "ezcount.php";
Counter ("index.log", 0, "digit", ".gif");
?>
Đoạn mã trên sẽ đưa nội dung tệp ezcount.php thành một phần của tệp index.php và gọi hàm
Counter với các tham số cụ thể: tên tệp lưu giá trị đếm là index.log, sử dụng bộ đếm dạng đồ hoạ
($Text bằng 0), thư mục chứa các tệp con số là digit, và phần mở rộng của các tệp con số là .gif.
Bằng cách gán sẵn một số giá trị cho các tham số khi khai báo hàm như sau:
function Counter ($CountFile, $Text=1, $ImgPath="digit", $ImgType=".gif")
nếu cần gọi hàm Counter để hiện bộ đếm dạng văn bản, bạn chỉ cần viết như sau:
<?php
include "ezcount.php";
Counter ("index.log");
?>