เนื้อหานี้เป็นแนวทางสำหรับการประยุกต์ใช้งาน กรณีต้องการให้ผู้ใช้งาน
แต่ละคน ไม่สามารถทำการล็อกอินเข้าใช้งานพร้อมกันหลายๆ เครื่องจากบัญชี
ผู้ใช้งานเดียวกันได้ เช่น A ใช้ username:demo password:test
ล็อกอินเข้าใช้งานระบบแล้ว B จะใช้ username และ password ของ A
มาล็อกอิน เพื่อเข้าใช้งานพร้อมกันไม่ได้
โดยในการประยุกต์ จะใช้เรื่องของเวลามาเป็นตัวกำหนด ว่าผู้ใช้ หรือ user หนึ่งๆ
จะสามารถล็อกอินเข้าใช้งานได้หรือไม่
แนวทางทำความเข้าใจ
ถ้า A ล็อกอินเข้าใช้งาน สถานะล็อกอินอยู่เป็น 1 เวลาปัจจุบันที่ล็อกอินเป็น 12.00 น.
สมมติเราต้องการให้ทุกๆ 5 นาทีเวลาในระบบของ A จะอัพเดท ดังนั้น
ถ้า A ยังใช้งานและยังไม่ปิดหน้าเพจไป เวลาในระบบของ A ก็จะเป็น
12.00 - 12.05 - 12.10 - 12.15 .... แบบนี้ไปเรื่อยๆ โดยเสมือนว่าเรากันให้ A
ล็อกอินอยู่ในระบบได้นาน 5 นาที
และ ถ้า B ล็อกอินเข้ามาใช้งาน โดยใช้บัญชีผู้ใช้เดียวกันในเวลา 12.03 น.
B จะไม่สามารถล็อกอินได้ เพราะ A ล็อกอินอยู่และจะรู้อีกทีว่า A ยังไช้งานหรือไม่ในเวลา 12.05
แต่ถ้า B ล็อกอินเข้ามาใช้งาน โดยใช้บัญชีผู้ใช้เดียวกันในเวลา 12.06 น.
และ A ไม่ได้ใช้งานต่อ ทำให้เวลาในระบบของ A ไม่เป็น 12.05 แต่เป็น 12.00
ซึ่งก็คือหลังจาก 5 นาที A ไม่ได้ใช้งานแล้ว B จึงสามารถล็อกอินได้
การกำหนดเวลาเพื่อตรวจสอบสถานะการใช้งาน
จะมีผลต่อการใช้งาน คือ ยิ่งถ้าเรากันเวลาไว้มากๆ อย่างเช่น 30 นาที
ถ้า A เข้าใช้งาน 12.00 น. ในช่วง 12.00-12.30 นั้น B จะไม่สามารถเข้าใช้งาน
ได้เลย ถึงแม้ว่า A จะไม่ได้ใช้งานแล้ว แต่ข้อดีคือ จะทำให้เราสามารถกำหนด
เวลาที่รออัพเดทได้กว้างขึ้น ทำให้ server ไม่ทำงานหนักเกินไป
ส่วนการกำหนดเวลาน้อย เช่นกำหนดเป็น 10 วินาที
ถ้า A เข้าใช้งาน 12.00.00 น. ในช่วง 12.00.00-12.00.10 นั้น B จะไม่สามารถเข้าใช้งาน
ได้ แต่ก็เป็นแค่ช่วงเวลาสั้นๆ เพราะ ถ้า A ไมได้ใช้งานแล้ว B ก็ไม่ต้องรอนาน
ก็สามารถล็อกอินเข้าใช้ได้ แต่ข้อเสียก็อาจจะมี เพราะเราจำเป็นต้องอัพเดทเวลา
ถี่ขึ้น server ก็อาจจะทำงานหนัก ถ้ามีผู้ใช้หลายคน
ยังไงก็ตามสามารถเลือกใช้ได้ตามความเหมาะสม
ในที่นี้ โค้ดตัวอย่าง จะกำหนดเวลาทุก 10 วินาที ให้ทำการอัพเดทเวลา
เริ่มต้นมาดูโครงสร้างตาราง tbl_user อย่างง่ายกัน
ได้เพิ่มผู้ใข้ตัวอย่างเข้าไปด้วยแล้ว
-- -- Table structure for table `tbl_user` -- CREATE TABLE IF NOT EXISTS `tbl_user` ( `user_id` int(11) NOT NULL, `user_name` varchar(100) NOT NULL, `user_pass` varchar(100) NOT NULL, `user_login_status` tinyint(1) NOT NULL, `user_datetime_using` datetime NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- -- Dumping data for table `tbl_user` -- INSERT INTO `tbl_user` (`user_id`, `user_name`, `user_pass`, `user_login_status`, `user_datetime_using`) VALUES (1, 'demo', 'test', 0, '0000-00-00 00:00:00'); -- -- Indexes for dumped tables -- -- -- Indexes for table `tbl_user` -- ALTER TABLE `tbl_user` ADD PRIMARY KEY (`user_id`), ADD KEY `user_login_status` (`user_login_status`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `tbl_user` -- ALTER TABLE `tbl_user` MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2;
ฟิลด์คอลัมน์ที่จำเป็น สำหรับใช้งานของเราคือ
user_login_status เก็บ สถานะการล็อกอินอยู่หรือไม่
user_datetime_using เก็บ เวลาที่มีการอัพเดท ขณะล็อกอินใช้งานอยู่
ตัวอย่างไฟล์ทั้ง คำอธิบายแสดงในโค้ด
ไฟล์ dbconnect.php
<?php
$mysqli = new mysqli("localhost", "root","","test");
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
if(!$mysqli->set_charset("utf8")) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
exit();
}
ไฟล์ page_login.php
<?php
session_start();
require("dbconnect.php");
// กำหนด array ข้อความ error
$msg_login_error=array(
"1"=>"เกิดข้อผิดพลาด ชื่อล็อกอินนี้ กำลังใช้งานอยู่! ",
"2"=>"เกิดข้อผิดพลาด โปรดกรอกชื่อผู้ใช้และรหัสผ่าน! ",
"3"=>"เกิดข้อผิดพลาด ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง! ",
);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Document</title>
</head>
<body>
<form name="form1" method="post" action="check_login.php">
<div style="margin:auto;width:500px;">
Username: <input type="text" name="u_name" autocomplete="off"> <br>
Password: <input type="password" name="u_pass" autocomplete="off">
<br>
<input type="submit" value="Login" name="btn_login">
<br>
<?php if(isset($_GET['error'])){?>
<?=$msg_login_error[$_GET['error']]?>
<?php } ?>
</div>
</form>
</body>
</html>
ไฟล์ check_login.php
<?php
session_start();
require("dbconnect.php");
if(isset($_POST['btn_login'])){ // เมื่อกดปุ่มล็กอิน
// ตรวจสอบการส่งค่าฟอร์ม ชื่อผู้ใช้และรหัสผ่าน ในที่น้้จะใช้รูปแบบอ่างง่าย หากต้องการความภัยเพิ่ม
// ควรปรับรูปแบบตามต้องการ
if(isset($_POST['u_name']) && $_POST['u_name']!=""
&& isset($_POST['u_pass']) && $_POST['u_pass']!=""){
$sql="
SELECT * FROM tbl_user WHERE user_name='".$_POST['u_name']."'
AND user_pass='".$_POST['u_pass']."'
";
// คำสั่งคิวรี่ทำงาน
if($result = $mysqli->query($sql)){
if($result->num_rows>0){ // พบข้อมูล
$row = $result->fetch_assoc();// ดึงข้อมูลจากฐานข้อมูล
$user_login_status_exist=$row['user_login_status']; // เก็บสถานะล็อกอิน
$user_datetime_using=$row['user_datetime_using']; // เก็บเวลาที่ใช้อยู่ล่าสุด
// ถ้ามีผู้ใช้ค้างสถานะล็อกอินชื่อนี้อยู่
if($user_login_status_exist==1){
// ถ้าเวลาที่ใช้อยู่ บวกอีก 10 วินาที มากกว่าหรือเท่ากับเวลาในปัจจุบัน
if(strtotime(date("Y-m-d H:i:s",strtotime($user_datetime_using." +10 second")))>=time()){
// กลับไปยังหรอล็อกอิน ส่ง error กลับ
header("Location:page_login.php?error=1");
exit;
}else{ // ถ้าน้อยกว่า หรือไม่ได้ใช้งานแล้ว
// สร้างตัวแปร session
$_SESSION['user_id_ses']=$row['user_id'];
$_SESSION['user_name_ses']=$row['user_name'];
// อัพเดทสถานะการล็อกอิน
$mysqli->query("
UPDATE tbl_user SET user_datetime_using='".date("Y-m-d H:i:s")."'
WHERE user_id='".$_SESSION['user_id_ses']."'
");
// ไปยังหน้าสมาชิก
header("Location:page_user.php");
exit;
}
}else{ // ถ้า ไม่มี ผู้ใช้ล็อกอินชื่อนี้อยู่
// สร้างตัวแปร session
$_SESSION['user_id_ses']=$row['user_id'];
$_SESSION['user_name_ses']=$row['user_name'];
// อัพเดทวันที่ เวลา และสถานะการล็อกอิน
$mysqli->query("
UPDATE tbl_user SET
user_login_status=1,
user_datetime_using='".date("Y-m-d H:i:s")."'
WHERE user_id='".$_SESSION['user_id_ses']."'
");
// ไปยังหน้าเพจของสมาชิก
header("Location:page_user.php");
exit;
}
}else{ // เกิดข้อผิดพลาด ไม่พบข้อมูลผู้ใช้ในระบบ
// กลับไปยังหรอล็อกอิน ส่ง error กลับ
header("Location:page_login.php?error=3");
exit;
}
}else{ // เกิดข้อผิดพลาดการคิวรี่
// กลับไปยังหรอล็อกอิน ส่ง error กลับ
header("Location:page_login.php?error=3");
exit;
}
}else{ // ไม่ได้กรอกข้อมูล
// กลับไปยังหรอล็อกอิน ส่ง error กลับ
header("Location:page_login.php?error=2");
exit;
}
}else{ // ไม่ได้กดปุ่มล็อกอิน
// กลับไปยังหรอล็อกอิน ส่ง error กลับ
header("Location:page_login.php?error=2");
exit;
}
?>
ไฟล์ page_user.php
<?php
session_start();
require("dbconnect.php");
// ถ้าไม่มี session ที่กำหนดสถานะสมาชิก
if(!isset($_SESSION['user_id_ses']) || $_SESSION['user_id_ses']=="")
{
// ไปที่หน้าล็อกอิน
header("Location:page_login.php");
exit;
}
if(isset($_POST['btn_loout'])) // ถ้ากดปุ่มล็อกเอาท์
{
// อัเดทสถานะการล็อกอิน
$mysqli->query("
UPDATE tbl_user SET
user_login_status=0
WHERE user_id='".$_SESSION['user_id_ses']."'
");
// ล้างตัวแปร session
unset(
$_SESSION['user_id_ses'],
$_SESSION['user_name_ses']
);
// ไปที่หน้าล็อกอิน
header("Location:page_login.php");
exit;
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Document</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
</head>
<body>
<form name="form1" method="post" action="">
<div style="margin:auto;width:500px;">
UserID : <?=$_SESSION['user_id_ses']?><br>
Username : <?=$_SESSION['user_name_ses']?><br>
<input type="submit" value="Logout" name="btn_loout">
</div>
</form>
<script type="text/javascript">
$(function(){
// กำหนดให้สคริปเช็คสถานะการใช้งานอยู่ของสมาชิกและอัพเดทเวลา ให้ทำงานทุกๆ 5 วินาที
setInterval(function(){
$.post("checkloginuser.php",function(data){
if(data==0){ // ถ้าไม่ได้ใช้แล้วหรือล็อกเอาท์หรืออื่นๆ
// ให้ไปที่หน้าล็อกอิน
window.location='page_login.php';
}
});
},10000); // 1000 เท่ากับ 1 วินาที
});
</script>
</body>
</html>
ไฟล์ checkloginuser.php
<?php
session_start();
require("dbconnect.php");
// ถ้าสมาชิกยังมีการใช้งานเพจอยู่
if(isset($_SESSION['user_id_ses']) && $_SESSION['user_id_ses']!="")
{
// ให้อัพเดทเวลาที่ใช้อยู่ปัจจุบัน กับ สถานะการล็อกอิน
$mysqli->query("
UPDATE tbl_user SET
user_login_status=1,
user_datetime_using='".date("Y-m-d H:i:s")."'
WHERE user_id='".$_SESSION['user_id_ses']."'
");
echo date("Y-m-d H:i:s");
}else{ // ถ้าไม่ได้ใช้แล้วหรือล็อกเอาท์หรืออื่นๆ ส่งค่ากลับเป็น 0
echo 0;
}
?>
หากต้องการเปลี่ยนเวลาจากวินาทีเป็น นาที ให้เปลี่ยนในส่วนของโค้ด
ในไฟล์ check_login.php
if(strtotime(date("Y-m-d H:i:s",strtotime($user_datetime_using." +10 second")))>=time()){
เปลี่ยน second เป็น minute กำหนดตัวเลขตามต้องการ เช่น สมมติให้เป็นทุกๆ 5 นาที ก็กำหนดเป็น
if(strtotime(date("Y-m-d H:i:s",strtotime($user_datetime_using." +5 minute")))>=time()){
และก็แก้ไขส่วนของการกำหนดเวลาเรียกใช้งานอัพเดทเวลาในไฟล์ page_user.php
โดยเปลี่ยนดังนี้
<script type="text/javascript">
$(function(){
// กำหนดให้สคริปเช็คสถานะการใช้งานอยู่ของสมาชิกและอัพเดทเวลา ให้ทำงานทุกๆ 5 วินาที
setInterval(function(){
$.post("checkloginuser.php",function(data){
if(data==0){ // ถ้าไม่ได้ใช้แล้วหรือล็อกเอาท์หรืออื่นๆ
// ให้ไปที่หน้าล็อกอิน
window.location='page_login.php';
}
});
},10000); // 1000 เท่ากับ 1 วินาที
});
</script>
เป็น
<script type="text/javascript">
$(function(){
// กำหนดให้สคริปเช็คสถานะการใช้งานอยู่ของสมาชิกและอัพเดทเวลา ให้ทำงานทุกๆ 5 วินาที
setInterval(function(){
$.post("checkloginuser.php",function(data){
if(data==0){ // ถ้าไม่ได้ใช้แล้วหรือล็อกเอาท์หรืออื่นๆ
// ให้ไปที่หน้าล็อกอิน
window.location='page_login.php';
}
});
},300000); // 1000 เท่ากับ 1 วินาที // เท่ากับ 300 วินาทีเท่ากับ 5 นาที
});
</script>
สามารถนำไปใช้เป็นแนวทางในการประยุกต์เพิ่มเติม