แนวทางห้ามบัญชีผู้ใช้ ไม่ให้ล็อกอินใช้งานพร้อมกัน ด้วย php และ ajax
เขียนเมื่อ 7 ปีก่อน โดย Ninenik Narkdeeajax login php
คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ ajax login php
ดูแล้ว 10,394 ครั้ง
ไปที่
Copy
เนื้อหานี้เป็นแนวทางสำหรับการประยุกต์ใช้งาน กรณีต้องการให้ผู้ใช้งาน
แต่ละคน ไม่สามารถทำการล็อกอินเข้าใช้งานพร้อมกันหลายๆ เครื่องจากบัญชี
ผู้ใช้งานเดียวกันได้ เช่น 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>
สามารถนำไปใช้เป็นแนวทางในการประยุกต์เพิ่มเติม
กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ
เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก
กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ
ยังไม่เป็นสมาชิก
สมาชิกล็อกอิน
สมาชิกล็อกอิน
( หรือ เข้าใช้งานผ่าน Social Login )
URL สำหรับอ้างอิง
Top
Copy
คำแนะนำ และการใช้งาน
สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก
- ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา
โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ