Chủ Nhật, 8 tháng 7, 2012

Đếm Số Người Truy Cập Web Bằng PHP-MySQL

Posted by Unknown Chủ Nhật, tháng 7 08, 2012, under | 3 comments

Vấn đề là chúng ta muốn đếm số người truy cập trang web của mình trong ngày, tuần, khách đang online thì làm sao ? Có 2 cách: 1 đang ký free account ở trang web cung cấp  modun đếm người .; 2. tự code . Mình có Demo tự code đếm số người truy cập web , thực hiện trình tự như sau:
1. Tạo file"connect.php", file này sẽ kết nối CSDL với MySQL, tự tạo ra  CSDL "online", bảng DL "counter" ,nội dung file như sau:
<?php
$db_host = 'localhost'; // localhost / ip
$db_user = 'root';// tai khoan Admin
$db_pass = ''; // pass dang nhap
$db_data = 'shopping'; // ten database 

// thực hiện kết nối và kiểm tra có thành công hay không
if ($conn = @mysql_connect($db_host, $db_user, $db_pass)) {
    // nếu thành công, thực hiện chọn CSDL
    if (!@mysql_select_db($db_data)) {
        // nếu chọn thất bại, tiến hành tạo CSDL và tạo bảng.
        mysql_query('CREATE DATABASE `' . $db_data . '` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci');
        mysql_select_db($db_data);
        mysql_query('CREATE TABLE IF NOT EXISTS `counter` (
                `ip_address` varchar(15) NOT NULL,
                `last_visit` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                KEY `ip_address` (`ip_address`)
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1;');
    }
} else {
    // thông báo lỗi nếu không kết nối CSDL được.
    die(mysql_error());
}
?>
2. Tạo file "counter.php", file có nhiệm vụ lấy IP máy khách rồi  gửi về Server , lấy CSDL in ra  trình duyệt, nội dung file như sau:
 <meta http-equiv="content-type" content="text/html;charset=utf-8" />

<?php
$time_now = time();    // lưu thời gian hiện tại
$time_out = 60; // khoảng thời gian chờ để tính một kết nối mới (tính bằng giây)
$ip_address = $_SERVER['REMOTE_ADDR'];    // lưu lại IP của kết nối


require_once('connect.php');    // nhúng file kết nối CSDL vào

// kiểm tra xem thời gian hiện tại so với lần truy cập cuối có lớn hơn khoảng thời gian chờ không
    //- nếu không thì thôi
    //- nếu có thì thêm vào như là một kết nối mới
if (!mysql_num_rows(mysql_query("SELECT `ip_address` FROM `counter` WHERE UNIX_TIMESTAMP(`last_visit`) + $time_out > $time_now AND `ip_address` = '$ip_address'")))
    mysql_query("INSERT INTO `counter` VALUES ('$ip_address', NOW())");

// đếm số người đang online
$online = mysql_num_rows(mysql_query("SELECT `ip_address` FROM `counter` WHERE UNIX_TIMESTAMP(`last_visit`) + $time_out > $time_now"));

// đếm số người ghé thăm trong ngày (từ 0h ngày hôm đó đến thời điểm hiện tại)
$day = mysql_num_rows(mysql_query("SELECT `ip_address` FROM `counter` WHERE DAYOFYEAR(`last_visit`) = " . (date('z') + 1) . " AND YEAR(`last_visit`) = " . date('Y')));

// đếm số người ghé thăm ngay hôm qua 
$yesterday = mysql_num_rows(mysql_query("SELECT `ip_address` FROM `counter` WHERE DAYOFYEAR(`last_visit`) = " . (date('z') + 0) . " AND YEAR(`last_visit`) = " . date('Y')));

// đếm số người ghé thăm trong tuần (từ 0h ngày thứ 2 đến thời điểm hiện tại)
$week = mysql_num_rows(mysql_query("SELECT `ip_address` FROM `counter` WHERE WEEKOFYEAR(`last_visit`) = " . date('W') . " AND YEAR(`last_visit`) = " . date('Y')));

// đếm số người ghé thăm tuần trước
$lastweek = mysql_num_rows(mysql_query("SELECT `ip_address` FROM `counter` WHERE WEEKOFYEAR(`last_visit`) = " . (date('W') - 1). " AND YEAR(`last_visit`) = " . date('Y')));

// đếm số người ghé thăm trong tháng
$month = mysql_num_rows(mysql_query("SELECT `ip_address` FROM `counter` WHERE MONTH(`last_visit`) = " . date('n') . " AND YEAR(`last_visit`) = " . date('Y')));

// đếm số người ghé thăm trong năm
$year = mysql_num_rows(mysql_query("SELECT `ip_address` FROM `counter` WHERE YEAR(`last_visit`) = " . date('Y')));

// đếm tổng số người đã ghé thăm
$visit = mysql_num_rows(mysql_query("SELECT `ip_address` FROM `counter`"));


echo '<pre>' .'<br />' .'<br />' .
     ' Đang online: ' . $online . '<br />' .
     ' Hôm nay: ' . $day . '<br />' .
     ' Hôm qua: ' . $yesterday . '<br />' .
     ' Tuần này: ' . $week . '<br />' .
     ' Tuần trước: ' . $lastweek . '<br />' .
     ' Tháng này: ' . $month . '<br />' .
     ' Năm nay: ' . $year . '<br />' .
     ' Lượt truy cập: ' . $visit .
     '</pre>';
?> 

3. Tạo file"index.php" , file này có nhiệm vụ include file counter  ( nếu muốn kết quả đếm hiện ở đâu thì đặt " <?php include("counter.php"); ?>  ở đó ), nội dung  file như sau:
<?php
include("counter.php"); 
?>


4. Demo:
Hình minh họa :






3 nhận xét:

Chào bạn mình xem code của bạn về chạy thử mọi thứ rất ok trừ cái ngày nó hiển thị không đúng bạn có thể kiểm tra lại câu query dùng mình không ? Nói thật câu query của bạn mình không hiểu rõ cho lắm ( date('z') + 1)

Cảm ơn bạn nhiều mình đang làm về cái này!

Code này nếu site 100k view thì DB cũng phải nặng ~8MB và khiến web load chậm hơn bình thường vì colum chứa quá nhiều dữ liệu. :(

Đăng nhận xét

Vui lòng viết Tiếng Việt có dấu !


Xem Nhiều

Bài đăng phổ biến

Lưu trữ blog

Blog Archive