เนื้อหานี้เป็นแนวทางสำหรับการประยุกต์ใช้งาน กรณีต้องการให้ผู้ใช้งาน
แต่ละคน ไม่สามารถทำการล็อกอินเข้าใช้งานพร้อมกันหลายๆ เครื่องจากบัญชี
ผู้ใช้งานเดียวกันได้ เช่น 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>
สามารถนำไปใช้เป็นแนวทางในการประยุกต์เพิ่มเติม