เนื้อหานี้เป็นแนวทางสำหรับการประยุกต์ใช้งาน กรณีต้องการให้ผู้ใช้งาน
แต่ละคน ไม่สามารถทำการล็อกอินเข้าใช้งานพร้อมกันหลายๆ เครื่องจากบัญชี
ผู้ใช้งานเดียวกันได้ เช่น 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 อย่างง่ายกัน
ได้เพิ่มผู้ใข้ตัวอย่างเข้าไปด้วยแล้ว
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | -- -- 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
1 2 3 4 5 6 7 8 9 10 11 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | <?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> </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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?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
1 | if ( strtotime ( date ( "Y-m-d H:i:s" , strtotime ( $user_datetime_using . " +10 second" )))>=time()){ |
เปลี่ยน second เป็น minute กำหนดตัวเลขตามต้องการ เช่น สมมติให้เป็นทุกๆ 5 นาที ก็กำหนดเป็น
1 | if ( strtotime ( date ( "Y-m-d H:i:s" , strtotime ( $user_datetime_using . " +5 minute" )))>=time()){ |
และก็แก้ไขส่วนของการกำหนดเวลาเรียกใช้งานอัพเดทเวลาในไฟล์ page_user.php
โดยเปลี่ยนดังนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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> |
เป็น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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> |
สามารถนำไปใช้เป็นแนวทางในการประยุกต์เพิ่มเติม