|
PHP ทำระบบ Online User ระหว่าง Member Online (สมาชิก) กับ Guest Online (บุคคลทั่วไป) - MySQLi |
PHP ทำระบบ Online User ระหว่าง Member Online (สมาชิก) กับ Guest Online (บุคคลทั่วไป) - MySQLi เห็นถามกันบ่อย ๆ เกี่ยวกับระบบ User online หรือสมาชิกที่กำลัง Online อยู่บนเว็บไซต์ของเรา โดยมีเงื่อนว่าสามารถแยกจำนวนระหว่าง Member (สมาชิก) และ Guest (บุคคลทั่วไป)
PHP and Member/Guest Online User
ซึ่งในระบบนี้เราจำเป็นจะต้องมีฐานข้อมูลของสมาชิกมาเกี่ยวข้องอย่างแน่นอน โดยหลัก ๆ แล้วจะประกอบด้วย 2 ตาราง คือ member (เก็บข้อมูลสมาชิก) และ online (เก็บข้อมูลการออนไลน์ทั้งสมาชิกและบุคคลทั่วไป) โดยในบทความนี้ยังคงใช้ php กับฐานข้อมูลของ MySQL และ function ของ mysqli ซึ่งเป็น function ล่าสุดที่แนะนำให้ใช้ร่วมกับ MySQL Database
member (จัดเก็บข้อมูลสมาชิก)
CREATE TABLE `member` (
`UserID` int(3) unsigned zerofill NOT NULL auto_increment,
`Username` varchar(20) NOT NULL,
`Password` varchar(20) NOT NULL,
`Name` varchar(100) NOT NULL,
PRIMARY KEY (`UserID`),
UNIQUE KEY `Username` (`Username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
INSERT INTO `member` VALUES (001, 'win', 'win123', 'Weerachai Nukitram');
INSERT INTO `member` VALUES (002, 'chai', 'chai123', 'Surachai Sirisart');
INSERT INTO `member` VALUES (003, 'sorn', 'sorn123', 'Adisorn Boonsong');
INSERT INTO `member` VALUES (004, 'max', 'max123', 'Surapong Junsiripun');
online (จัดเก็บข้อมูลการออนไลน์)
CREATE TABLE `online` (
`SID` varchar(32) NOT NULL,
`UserID` int(3) NOT NULL,
`OnlineLastTime` datetime NOT NULL,
PRIMARY KEY (`SID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ในตาราง online จะเห็นว่าจะฟิวด์ชื่อว่า UserID (เก็บรหัสสมาชิกที่ Online ถ้าเป็นบุคคลทั่วไปจะเก็บ 0)
ส่วน Concept นั้นเราจะเก็บข้อมูลของทั้งสมาชิกและบุคคลทั่วไปที่เข้ามาในระบบจัดเก็บลงในตารางของ online โดยใช้ Session ID เป็น Key ในการจัดเก็บ และ UserID เป็นรหัสของสมาชิก ส่วน OnlineLastTime เป็นเวลาที่ Session ID ของสมาชิกนั้น ๆ ซึ่งเมื่อ User คลิกไปยังหน้าอื่น ๆ เราจะต้อง Update ตัว OnlineLastTime ให้เป็นเวลาล่าสุดเสมอ ซึ่งตัวเลานี้เองเราจะใช้ในการลบสมาชิกที่ออกจากระบบ เช่นถ้าไม่ได้มีการ Update เป็นเวลา 20 นาที ก็ให้ลบ Session ID นั้น ๆ ออกไป
คำสั่ง Insert ข้อมูล Client หรือ Session ID ที่ Online เข้ามาในระบบ
$intUserID = 0;
$strSessionID = session_id();
if(isset($_SESSION['UserID']))
{
$intUserID = $_SESSION["UserID"];
}
$sql = "INSERT INTO online (SID,UserID,OnlineLastTime) VALUES ('$strSessionID','$intUserID',NOW()) ON DUPLICATE KEY UPDATE UserID = '$intUserID',OnlineLastTime = NOW()";
$query = mysqli_query($con,$sql);
ใน คำสั่งนี้เป็นไปได้ทั้ง Insert และ Update โดยในกรณีที่ยังไม่เคยมี Session ID จะใช้การ Insert แต่ในกรณีเป็น Session ID ที่มีอยู่แล้วจะ Update ตัว UserID (กรณีที่สมาชิก Login) และ OnlineLastTime เป็นเวลาล่าสุดที่อยู่ในระบบ
เป็นคำสั่งสำหรับลบรายการ Client หรือ Session ID ที่ออกจากระบบ เช่น ไม่ได้มีการคลิกไปยังหน้าอื่น ๆ ภายใน 30 นาที
$intRejectTime = 20; // Minute
$sql = "DELETE FROM online WHERE DATE_ADD(OnlineLastTime, INTERVAL $intRejectTime MINUTE) <= NOW() ";
$query = mysqli_query($con,$sql);
นับจำนวนบุคคลทั่วไป หรือ Guest
$intGuestOnline = 0;
$sql = "SELECT COUNT(SID) AS GuestOnline FROM online WHERE UserID = '0' ";
$query = mysqli_query($con,$sql);
if($query)
{
$objResult = mysqli_fetch_array($query,MYSQLI_ASSOC);
$intGuestOnline = $objResult["GuestOnline"];
}
นับจำนวนสมาชิกหรือ Member
$intMemberOnline = 0;
$sql = "SELECT COUNT(SID) AS MemberOnline FROM online WHERE UserID != '0' ";
$query = mysqli_query($con,$sql);
if($query)
{
$objResult = mysqli_fetch_array($query,MYSQLI_ASSOC);
$intMemberOnline = $objResult["MemberOnline"];
}
ซึ่งคำสั่งทั้งหมดนี้จะต้องเรียกไปใช้งานทุกครั้ง โดยอาจจะแทรกไว้ในส่วนของ Connect ไฟล์ หรือจะสร้างเป็น Include ไฟล์ แล้วเรียกใช้งานในทุก ๆ ส่วนของเว็บไซต์
มาดู Code ทั้งหมด
connect.php
<?php
ini_set('display_errors', 1);
error_reporting(~0);
$serverName = "localhost";
$userName = "root";
$userPassword = "root";
$dbName = "login";
$con = mysqli_connect($serverName,$userName,$userPassword,$dbName);
if (mysqli_connect_errno())
{
echo "Database Connect Failed : " . mysqli_connect_error();
exit();
}
// Update Stay online
$intUserID = 0;
$strSessionID = session_id();
if(isset($_SESSION['UserID']))
{
$intUserID = $_SESSION["UserID"];
}
$sql = "INSERT INTO online (SID,UserID,OnlineLastTime) VALUES ('$strSessionID','$intUserID',NOW()) ON DUPLICATE KEY UPDATE UserID = '$intUserID',OnlineLastTime = NOW()";
$query = mysqli_query($con,$sql);
//*** Reject User not online
$intRejectTime = 20; // Minute
$sql = "DELETE FROM online WHERE DATE_ADD(OnlineLastTime, INTERVAL $intRejectTime MINUTE) <= NOW() ";
$query = mysqli_query($con,$sql);
//*** Count Guest Online
$intGuestOnline = 0;
$sql = "SELECT COUNT(SID) AS GuestOnline FROM online WHERE UserID = '0' ";
$query = mysqli_query($con,$sql);
if($query)
{
$objResult = mysqli_fetch_array($query,MYSQLI_ASSOC);
$intGuestOnline = $objResult["GuestOnline"];
}
//*** Count Member Online
$intMemberOnline = 0;
$sql = "SELECT COUNT(SID) AS MemberOnline FROM online WHERE UserID != '0' ";
$query = mysqli_query($con,$sql);
if($query)
{
$objResult = mysqli_fetch_array($query,MYSQLI_ASSOC);
$intMemberOnline = $objResult["MemberOnline"];
}
?>
login.php
<html>
<head>
<title>ThaiCreate.Com Tutorials</title>
</head>
<body>
<form name="form1" method="post" action="check_login.php">
Login<br>
<table border="1" style="width: 300px">
<tbody>
<tr>
<td> Username</td>
<td>
<input name="txtUsername" type="text" id="txtUsername">
</td>
</tr>
<tr>
<td> Password</td>
<td><input name="txtPassword" type="password" id="txtPassword">
</td>
</tr>
</tbody>
</table>
<br>
<input type="submit" name="Submit" value="Login">
</form>
</body>
</html>
check_login.php
<?php
session_start();
require_once("connect.php");
$strUsername = mysqli_real_escape_string($con,$_POST['txtUsername']);
$strPassword = mysqli_real_escape_string($con,$_POST['txtPassword']);
$strSQL = "SELECT * FROM member WHERE Username = '".$strUsername."'
and Password = '".$strPassword."'";
$objQuery = mysqli_query($con,$strSQL);
$objResult = mysqli_fetch_array($objQuery);
if(!$objResult)
{
echo "Username and Password Incorrect!";
exit();
}
else
{
//*** Session
$_SESSION["UserID"] = $objResult["UserID"];
session_write_close();
//*** Go to Main page
header("location:index1.php");
}
mysqli_close($con);
?>
index1.php
<?php
session_start();
require_once("connect.php");
?>
<html>
<head>
<title>ThaiCreate.Com Tutorials</title>
</head>
<body>
Welcome to Page 1 ! <br>
<br>
Guest Online <b><?php echo $intGuestOnline;?></b> , Member Online <b><?php echo $intMemberOnline;?></b>
<br>
<br>
<br>
<a href="index2.php">Page 2</a><br>
<br>
<br>
<br>
<?php
if(isset($_SESSION['UserID']))
{
//*** Get User Login
$strSQL = "SELECT * FROM member WHERE UserID = '".$_SESSION['UserID']."' ";
$objQuery = mysqli_query($con,$strSQL);
$objResult = mysqli_fetch_array($objQuery,MYSQLI_ASSOC);
echo "Hello , ".$objResult["Name"];
?>
<br><br>
<a href="logout.php">Logout</a>
<?php
} else {
?>
<a href="login.php">Member Login</a>
<?php } ?>
</body>
</html>
index2.php
<?php
session_start();
require_once("connect.php");
?>
<html>
<head>
<title>ThaiCreate.Com Tutorials</title>
</head>
<body>
Welcome to Page 2 ! <br>
<br>
Guest Online <b><?php echo $intGuestOnline;?></b> , Member Online <b><?php echo $intMemberOnline;?></b>
<br>
<br>
<br>
<a href="index1.php">Page 1</a><br>
<br>
<br>
<br>
<?php
if(isset($_SESSION['UserID']))
{
//*** Get User Login
$strSQL = "SELECT * FROM member WHERE UserID = '".$_SESSION['UserID']."' ";
$objQuery = mysqli_query($con,$strSQL);
$objResult = mysqli_fetch_array($objQuery,MYSQLI_ASSOC);
echo "Hello , ".$objResult["Name"];
?>
<br><br>
<a href="logout.php">Logout</a>
<?php
} else {
?>
<a href="login.php">Member Login</a>
<?php } ?>
</body>
</html>
logout.php
<?php
session_start();
require_once("connect.php");
//*** Update Status
$sql = "DELETE FROM online WHERE UserID = '".$_SESSION["UserID"]."' ";
$query = mysqli_query($con,$sql);
session_destroy();
header("location:index1.php");
?>
ทดสอบการทำงาน
ครั้งแรกเรียกไฟล์ index.php ซึ่งการเข้ามาในครั้งแรกจะถูกมองว่าเป็น Guest หรือบุลคลทั่วไป
ทดสอบ Login เข้าสู่ระบบสมาชิก
แสดงจำนวนของสมาชิกที่ Online
ทดสอบเข้าจาก Web Browser อื่น ๆ จะเห็นว่าจำนวน Online จะเพิ่มขึ้น
ทดสอบเข้าจาก Web Browser อื่น ๆ จะเห็นว่าจำนวน Online จะเพิ่มขึ้น
ทดสอบเข้าจาก Web Browser อื่น ๆ จะเห็นว่าจำนวน Online จะเพิ่มขึ้น
สำหรับตัวอย่างการทำ Register Form หรือ ฟอร์มสำหรับสมัครสมาชิก สามารถอ่านได้ที่
Go to : PHP MySQL กับ Register Form ทำระบบ สมัครสมาชิกเก็บข้อมูลง่าย ๆ เช่น รหัสสมาชิก (Username) รหัสผ่าน (Password)
Go to : PHP Member Register and Email Activation
บทความที่เกี่ยวข้อง
Go to : PHP ทำระบบ Login และป้องกันการ ล็อกอิน ซ้ำซ้อนใน User เดียวกัน (MySQLi , Duplicate Session)
Go to : PHP Authentication : การใช้งาน Authentication ตรวจสอบสถานะการ Login
Go to : PHP Session ($_SESSION,$HTTP_SESSION_VARS)
Go to : PHP MySQL : Connect to MySQL Database ภาษา PHP กับฐานข้อมูล MySQL
|
|
|
By : |
TC Admin
|
|
Article : |
บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ |
|
Score Rating : |
|
|
Create Date : |
2014-10-08 |
|
Download : |
No files |
|
Sponsored Links |
|
|
|
|
|
|