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

เขียนเมื่อ 8 ปีก่อน โดย Ninenik Narkdee
login php ajax

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ login php ajax

ดูแล้ว 11,057 ครั้ง


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


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ





Tags:: ajax login php




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

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




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











เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ