Đào Tạo PHP & Mysql

Học PHP Online - PHP Framework - Tự Học PHP

Lập Trình PHP Căn Bản

Bài 16: Viết ứng dụng đếm số người online bằng php

Trong bài này, chúng ta sẽ nói về cách thức xây dựng tính năng thống kê số người đang viếng thăm website của bạn. Vì là chức năng nhỏ, nên tôi không đi nhiều về những tính năng lớn như bao nhiêu khách, bao nhiêu thành viên,...Chỉ đơn thuần là quá trình hiển thị hiện tại có bao nhiều người đang thăm viếng website của bạn.


Trước hết, chúng ta khởi tạo cở sở dữ liệu như sau. (xem lại bài bài 9: ngôn ngữ SQL và MYSQL cơ bản)

tgtmp là thời gian mà họ truy cập được tính khi họ truy vào trang web đó.


IP là dãy số lưu thông tin IP của họ khi viếng thăm website của chúng ta.


local là nơi lưu đường dẫn mà họ đang truy cập.


Khi người dùng truy cập vào trang web, chúng ta sẽ tiến hành insert thông tin của họ vào cơ sở dữ liệu với các tham số cơ bản nhưng trong database.


tgtmp được tính ra bằng hàm time(). Hàm này sẽ lấy ra thời gian hiện tại của người truy cập. Tiếp tục ta lại tính thời gian mới của họ, được tính bằng việc quy ước thời gian quy định. Cụ thể ở đây tôi cho là 900 giây tương đương với 15 phút truy cập của họ.

như vậy nếu thời gian lưu trong database mà nhỏ hơn thời gian new này thì chúng ta có thể hiểu rằng vị khách ấy đã rời khỏi website của chúng ta. Cụ thể hơn.


Ví dụ: tôi viếng thăm website đó là 7h.


như vậy hệ thống sẽ ghi thông tin lúc đó là 7h.


Nếu sau 1 thời gian tôi không làm gì, hoặc tôi không truy cập website đó nữa thì hệ thống sẽ không ghi nhận thông tin mới. Như thế nếu bây giờ 8h và trừ đi 15 phút tôi quy ước, rõ ràng là thời gian mới hiện tại là 7h45, Thời gian này vẫn lớn hơn thời điểm lưu thông tin 7h (7h45 > 7h). Do vậy, nếu chúng thỏa điều kiện đó thì chúng ta chỉ việc xóa đi các record trong cơ sở dữ liệu là xong.


Vậy ta có code kết nối CSDL như sau:(xem lại bài 10: kết hợp PHP và MYSQL trong ứng dụng)

Sau đó ta tiến hành ghi nhận thông tin người dùng vào CSDL.

$REMOTE_ADDR là biến môi trường dùng để lấy ra IP của người truy cập.


$PHP_SELF là biến môi trường dùng để lấy ra đường dẫn mà người dùng đang truy cập.


Tiếp đến ta tiến hành xóa record khi thời gian thực lớn hơn thời gian trong cơ sở dữ liệu.

Tiếp tục là công việc hiển thị thông tin ra bên ngoài bằng cách liệt kệ các record có trong database.

DISTINCT là cú pháp cho phép liệt kệ các dòng record mà không cho phép chúng có dữ liệu trùng lặp như cú pháp select bình thường.


Vậy chúng ta sẽ liệt kê tất cả những ip của những ai đang truy cập trên trang useronline.php.


Phần việc cuối cùng còn lại là chúng ta sẽ xuất thông tin ấy ra trình duyệt.


Và sau đây là toàn bộ nội dung code của trang useronline.php


(Bùi Quốc Huy)
41634
Bạn vẫn chưa hiểu rõ vấn đề ?. Bạn vẫn còn nhiều điều thắc mắc ?. Bạn gặp lỗi khi thực hành mã lệnh trên ?. Hãy tham gia diễn đàn QHOnline.Info để nhận được sự giúp đỡ từ phía cộng đồng nhanh nhất. Đồng thời tải những tài liệu giá trị tại diễn đàn. Việc đăng ký là hoàn toàn miễn phí, hãy đăng ký ngay để chúng tôi giúp đỡ bạn nhé.

Ghi rõ nguồn từ website QHOnline.Info - Khi bạn phát hành lại thông tin từ website này

Phản hồi của bạn Tiếng Anh Telex VNI VIQR





bá vinh (07:51 03/03/2010)

thầy oi! làm luôn bài đếm số thành viên và khách online đi thầy

Reply

Trần Văn Nhân (05:29 31/03/2010)

Hi.
Rất cám ơn bài viết của anh. Em đã làm được đếm số người Online rồi.
tuy nhiên em phải sửa chút mới chạy được
chắc anh copy_paste nên nhầm chỗ:
$sql="SELECT DISTINCT ip FROM useronline WHERE file='$PHP_SELF'";

em chuyển file thành local mới chạy được.

cám ơn anh nhiều nhé.

Reply

vinh (16:26 15/04/2010)

rất dễ hiểu, chi tiêt.
các bài đều rất hay.
Góp ý:
- khi tôi đọc bài 16: thì "Các bản tin khác" nên đề bài 14-15-17-18... chứ không nên để bài củ như vậy, khi muốn đọc tiếp rất khó khăn.

Reply

duongtamki (01:11 24/04/2010)

file trong cau lenh
$sql="SELECT DISTINCT ip FROM useronline WHERE file='$PHP_SELF'";
ở đâu ra vậy ?

Reply

minh (16:55 29/04/2010)

làm luôn bài đếm số thành viên và lượt truy cập đi thầy

Reply

minh quang (13:07 24/06/2010)

sao thay k cho lun cai bai va database de em ve sua cho de,neu dc thay gui cho e nha,thank thay

Reply

Nguyễn Văn Trường (00:11 01/07/2010)

Bài viết của thầy rất có ích,nhờ vào đó em đã viết được ứng dụng thầy đã dậy.tuy nhiên khi kiểm tra trong table useronline thì em chỉ thấy mỗi trường "tgtmp" là có dữ liệu trong khi câu lệnh "insert" mình có insert dl vào 2 trường còn lại:$sql="insert into useronline(tgtmp,ip,local) values('$tg','$REMOTE_ADDR','$PHP_SELF')";.
Mong thầy giải thích giúp em để em hiểu rõ hơn về vấn đề này.em xin cảm ơn thầy rất nhiều.
Mong thầy tiếp tục dậy chúng em những ứng dụng khác nữa như là u/d mua hàng vv...

Reply

Lan Anh (10:35 14/07/2010)

Ban thay dong lenh so 7 nhu sau thi se insert vao CSDL okie!

$sql="insert into useronline(tgtmp,ip,local) values('$tg','$_SERVER[REMOTE_ADDR]','$_SERVER[PHP_SELF]')";

Chuc ban vui!

Reply

Văn Hùng (22:39 26/07/2010)

Sao em dùng biến $REMOTE_ADDR không lấy được IP của máy khách mà dữ liệu trong cột ip toàn để trống

Reply

bá cường (15:33 06/09/2010)

Theo mình thì thuật toán trên hoàn toàn sai không đúng. Giả sử các cùng một mạng lan mà ta cùng truy cập đến địa chỉ trang web của bạn mà tất cả các máy đó khi truy cập vào trang web của bạn sẽ lấy đc 1 ip duy nhất. Lúc đó bạn tính thế nào. Cách chính xác nhất phải theo secsion của máy truy cập.

Reply

Phạm văn hiệp (08:37 19/09/2010)

em làm y hệt như trên nhưng báo lỗi này em chẳng biết sao nữa pro giúp em với nhé
:
Notice: Undefined variable: REMOTE_ADDR in C:wampwwwuseronline.php on line 28

Notice: Undefined variable: PHP_SELF in C:wampwwwuseronline.php on line 28

Notice: Undefined variable: PHP_SELF in C:wampwwwuseronline.php on line 36

Reply

vũ đình thắng (20:18 25/10/2010)

hay quá đi mất

Reply

Tống Kiện Phi (21:18 10/12/2010)

Code sai rồi

Giả sử khi 1 người thứ 1 vào thì ko có chuyện gì, số ngưòi online đc tính bằng 1.

Nhưng khi 1 ngừoi nữa vào thì dòng này là sai

$sql="delete from useronline where tgtmp < $tgnew";

Nó sẽ delete thằng vào đầu tiên trong CSDL ra vì thoả điều kiện where, và do đó trong CSDL bây h chỉ có 1 dòng dữ liệu của cái thằng thứ 2 mà thôi

Reply

Nguyễn Quốc Việt (20:33 12/12/2010)

Guip1 em với em chỉ biết tạo khóa chính PRIMARY KEY còn mục số 5 6 thì không biết

Code:
mysql> create table useronline(tgtmp INT(15) DEFAULT "0" NOT NULL ,

2 ip VARCHAR(50) NOT NULL ,

3 local VARCHAR(100) NOT NULL,

4 PRIMARY KEY(tgtmp),

5 KEY ip(ip),

6 KEY local(local));

em làm theo mà nó không chạy
mà thông báo kết quả sau :

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in D:xampplitehtdocsquocvietuseronline.php on line 25
user online :

Reply

nguyen van hung (23:19 21/04/2011)

cam on anh nha admin nha!e da lam duoc roi

Reply

nga (22:57 26/04/2011)

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:wampwwwWEBDIDONGincludeonline.php on line 14



bi j vay ban oi của minh ko chay

Reply

nga (23:59 26/04/2011)

Khong dem duoc ban oi.
$sql="insert into songuoionline(tgtc,ip,local) values('$tg','$_SERVER[REMOTE_ADDR]','$_SERVER[PHP_SELF]')";


$sql="SELECT DISTINCT ip FROM songuoionline WHERE file='$_SERVER[PHP_SELF]'";
dem ma ko duoc songuoi online

Reply

nga (12:52 27/04/2011)

mysql_num_rows() expects parameter 1 to be resource, boolean givenno bao loi j vay ban
chi dum thanks

Reply

nga (22:27 27/04/2011)

admin sua dum loi di addmin oi

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in D:xampplitehtdocsquocvietuseronline.php on line 25
user online :
em cung bi loi nay

them@truoc mysql_num_rows() thi ko loi
nhung ko hien duoc nguoi nao online het

Reply

Hưng (11:41 28/04/2011)

Hi Thầy,
Nếu làm như vậy thì hệ thống có nhiều user data sẽ được insert và xóa liên tục như vậy sao thầy. còn cách nào khác ko thầy :)

Reply

Văn Đại (10:07 05/05/2011)

sao của em nó cư báo lỗi hai biến $REMOTE_ADDR','$PHP_SELF' chưa được định nghĩa! thầy hay anh chị nào giúp em với !
em xin cảm ơn!

Reply

Bùi Thị Thanh Tâm (09:25 07/05/2011)

em muốn làm trang tin tức cho web mà không bít làm sao, viết code bằng php. Anh giúp em với. Cám ơn anh nhiều

Reply

mai văn bắc (19:52 16/06/2011)

tôi rất hoan hô sự hướng dẫn của bài viết này. Tôi cung đang học thêm php nên khi tiếp cận trang web này tôi lấy làm thích thú lắm. nếu có thể tôi sẽ là thành viên của trang này. xin chúc mọi người sức khỏe.

Reply

Chí Dũng Nguyễn (15:59 07/08/2011)

Tôi đã sửa lỗi rồi đây các Bạn:
?php
require('libs/dbcon.php');
$tg=time();
$user=
$tgout=900;
$tgnew=$tg - $tgout;
$sql="insert into useronline(tgtmp,ip,local) values('$tg','$REMOTE_ADDR','$PHP_SELF')";
$query=mysql_query($sql);
$sql="delete from useronline where tgtmp < $tgnew";
$query=mysql_query($sql);

$sql2="SELECT COUNT(DISTINCT ip) FROM useronline WHERE '$PHP_SELF'";
$query2=mysql_query($sql2);
$user=mysql_num_rows($query2);
echo "user online: $user";

Reply

Chí Dũng Nguyễn (16:18 07/08/2011)

Các Bạn sửa lại như sau:

$sql="SELECT COUNT( DISTINCT `ip` )
FROM `useronline`
WHERE 'file=$PHP_SELF'";

Chúc thành công nhé.
ChiDungNguyen-andungdotNET

Reply

dam quang dung (18:39 08/09/2011)

bài viết hay quá

Reply

Ngô Tấn Tài (15:12 22/09/2011)

Các bạn sửa lại như vậy sẽ cho kết quả đúng hơn
$tg=time();
$tgout=900;
$tgnew=$tg - $tgout;
$sql="insert into useronline(tgtmp,ip,local) values('$tg','$REMOTE_ADDR','$PHP_SELF')";
$query=mysql_query($sql);
$sql="delete from useronline where tgtmp < $tgnew";
$query=mysql_query($sql);

$sql2="SELECT DISTINCT ip FROM useronline'";
$query2=mysql_query($sql2);
$user=mysql_num_rows($query2);
echo "user online: $user";

Reply

nguyễn gia dần (12:14 04/10/2011)

Hình như code có vấn đề. mình chạy source sẵn - chạy bằng tay cũng thấy không ổn.

Reply

keke (14:23 24/10/2011)

các bạn nên sửa thêm thế này
<?php

$tg=time();
$tgout=900;
$tgnew=$tg - $tgout;


$link = mysql_connect('localhost', 'root', '');
if (!$link) {
die('Could not connect: ' . mysql_error());
}


$db_selected = mysql_select_db('online', $link);
if (!$db_selected) {
die ('Can't use online : ' . mysql_error());
}
$sql="insert into useronline(tgtmp,ip,local) values('$tg','$_SERVER[REMOTE_ADDR]','local')";
$query=mysql_query($sql);
$sql="delete from useronline where tgtmp < $tgnew";
$query=mysql_query($sql);

$sql2="SELECT COUNT(DISTINCT ip) FROM useronline WHERE local";
$query2=mysql_query($sql2);
$user=mysql_num_rows($query2);
echo "user online: $user";
?>

Reply

Nguyễn Thắng (18:23 05/11/2011)

Thầy xây dựng thêm ứng dụng đếm số lần xem bài viết và số lần truy cập được không thầy. Ứng dụng của thầy em làm được rồi nhưng không biết viết 2 ứng dụng trên như thế nào, mong thầy giúp đỡ. Cảm ơn thầy.

Reply

PHP MYSQL Online - Hoc PHP - Dao Tao PHP - Học PHP - CakePHP Framework - Lap Trinh PHP Can Ban - Lap Trinh PHP Nang Cao - PHP Framework - Tài liệu,Thư viện
Copyright 2007-2010 © QHOnline.Info | Powered By QHOnline Version 2.0 - XHTML Valid