PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

แนวทางห้ามบัญชีผู้ใช้ ไม่ให้ล็อกอินใช้งานพร้อมกัน ด้วย php และ ajax

17 September 2016 By


เนื้อหานี้เป็นแนวทางสำหรับการประยุกต์ใช้งาน กรณีต้องการให้ผู้ใช้งาน
แต่ละคน ไม่สามารถทำการล็อกอินเข้าใช้งานพร้อมกันหลายๆ เครื่องจากบัญชี
ผู้ใช้งานเดียวกันได้ เช่น 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: %sn", $mysqli->connect_error);  
    exit();  
}  
if(!$mysqli->set_charset("utf8")) {  
    printf("Error loading character set utf8: %sn", $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>
 
 
สามารถนำไปใช้เป็นแนวทางในการประยุกต์เพิ่มเติม

Tags:: php ajax login

เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน และลงชื่อติดตาม


สมัครสมาชิกได้ที่        ล็อกอินได้ที่   





URL สำหรับอ้างอิง