|
PHP ทำระบบ Login และป้องกันการ ล็อกอิน ซ้ำซ้อนใน User เดียวกัน (MySQLi , Duplicate Session) |
PHP ทำระบบ Login และป้องกันการ ล็อกอิน ซ้ำซ้อนใน User เดียวกัน (MySQLi , Duplicate Session) PHP ออกแบบและทำระบบป้องกันการ Login ซ้ำซ้อนใน User เดียวกัน บนฐานข้อมูล PHP กับ MySQL โดยใช้ function ของ mysqli เหมาะกับระบบที่ป้องกันการ Login User เดิมเข้ามาใช้ระบบในเวลาพร้อม ๆ กัน ๆ ซึ่ง Concept นั้นต้องบอกว่าไม่ยากเลย ซึ่งในระบบการ Login ปกติทั่ว ๆ ไป เราจะเช็ค Username และ Password แล้วจึงจะสามารถเข้าสู่ระบบได้ และเราเพียงเพิ่ม Flag หรือ Status ขึ้นมาว่าในขณะนี้ User นี้ได้มีการ Login เข้ามาในระบบแล้ว และเมื่อมีการ Login ซ้ำอีก เราก็จะเช็คแค่ Status
และสร้างฟิวด์สำหรับการ Update เวลาที่สมาชิกอยู่ในระบบล่าสุด ซึ่งจะมีการอัพเดททุก ๆ ครั้งที่สมาชิกคลิกไปยังหน้าต่าง ๆ ซึ่งเราจะใช้เวลาตัวนี้ใช้สำหรับการตรวจสอบสมาชิกที่ออกจากระบบโดยไม่ผ่านการ Logout เช่น เมื่อเวลาล่าสุดห่างจากเวลาปัจจับัน 10 หรือ 20 นาที ตามเงื่อนไขที่กำหนด แสดงว่าชมาชิกคนนั้น ๆ ไม่ได้อยู่หน้าจอหรือปิดหน้าจอไปแล้ว และเราจะใช้การอัพเดทสถานะหรือ Flag ให้กลับไปเป็นสถานะทว่ายังไม่ได้ Login หรือ Loout ออกจากระบบไปแล้ว
CREATE TABLE `member` (
`UserID` int(3) unsigned zerofill NOT NULL auto_increment,
`Username` varchar(20) NOT NULL,
`Password` varchar(20) NOT NULL,
`Name` varchar(100) NOT NULL,
`LoginStatus` int(1) NOT NULL,
`LastUpdate` datetime NOT NULL,
PRIMARY KEY (`UserID`),
UNIQUE KEY `Username` (`Username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
--
-- dump ตาราง `member`
--
INSERT INTO `member` VALUES (001, 'win', 'win123', 'Weerachai Nukitram', 0, '0000-00-00 00:00:00');
INSERT INTO `member` VALUES (002, 'chai', 'chai123', 'Surachai Sirisart', 0, '0000-00-00 00:00:00');
INSERT INTO `member` VALUES (003, 'sorn', 'sorn123', 'Adisorn Boonsong', 0, '0000-00-00 00:00:00');
INSERT INTO `member` VALUES (004, 'max', 'max123', 'Surapong Junsiripun', 0, '0000-00-00 00:00:00');
![PHP MySQL Duplicate Session PHP MySQL Duplicate Session](https://www.thaicreate.com/upload/stock/20141007113735.jpg?v=1001)
ในการออกแบบฐานข้อมูลเราจะเพิ่มฟิวด์ที่ชื่อว่า
- LoginStatus (0=ยังไม่ล็อกอิน , 1=ล็อกอินอยู่)
- LastUpdate (เก็บเวลาล่าสุดที่สมาชิกอยู่ในระบบ ซึ่งเมื่อสมาชิกคลิกไปยังหน้าอื่น ๆ เราจะต้องตามไปอัพเดทเวลาล่าสุด)
โค้ดของการตรวจสอบ Username / Password และป้องกันการ Login ซ้ำซ้อน
$strSQL = "SELECT * FROM member WHERE Username = '".$strUsername."'
and Password = '".$strPassword."'";
$objQuery = mysqli_query($con,$strSQL);
$objResult = mysqli_fetch_array($objQuery);
if(!$objResult)
{
echo "Username and Password Incorrect!";
exit();
}
else
{
if($objResult["LoginStatus"] == "1")
{
echo "'".$strUsername."' Exists login!";
exit();
}
else
{
//*** Update Status Login
$sql = "UPDATE member SET LoginStatus = '1' , LastUpdate = NOW() WHERE UserID = '".$objResult["UserID"]."' ";
$query = mysqli_query($con,$sql);
//*** Session
$_SESSION["UserID"] = $objResult["UserID"];
session_write_close();
//*** Go to Main page
header("location:page1.php");
}
}
จาก Code นี้เราจะเห็นว่ามีการตรวจสอบ Username และ Password แบบปกติ โดยในครั้งแรกที่ Login ผ่านเราจะ Update ตรง Status
![](/images/adv.jpg)
//*** Update Status Login
$sql = "UPDATE member SET LoginStatus = '1' , LastUpdate = NOW() WHERE UserID = '".$objResult["UserID"]."' ";
$query = mysqli_query($con,$sql);
ว่ามีการ Login เข้ามาระบบแล้วโดย LoginStatus = '1' และเมื่อ User คนเดียวกัน Login ซ้ำอีกครั้งระบบจะตรวจสอบ
if($objResult["LoginStatus"] == "1")
{
echo "'".$strUsername."' Exists login!";
exit();
}
นั่นหมายถึงว่าเมื่อมีการ Login แล้วจะ Login ซ้ำไม่ได้เด็ดขาด จน LoginStatus จะมีค่าเป็น 0 ซึ่งในหมายถึงว่าตอนที่ Logout เราจะต้อง Update ตรง LoginStatus = 0
$sql = "UPDATE member SET LoginStatus = '0', LastUpdate = '0000-00-00 00:00:00' WHERE UserID = '".$_SESSION["UserID"]."' ";
$query = mysqli_query($con,$sql);
เป็น Code สำหรับ Logout ซึ่งจะอัพเดทตรง LoginStatus = '0'
แล้วถ้าสมาชิกไม่ Logout ปิดหน้าเจอออกไปเลย???
ตามที่ได้ออกแบบไว้คือเราจะมีฟิวด์ชื่อว่า LastUpdate ซึ่งจะเก็บเวลาที่สมาชิกอยู่ในระบบล่าสุด ซึ่งเมื่อสมาชิกไปยังหน้าต่าง ๆ เราจะต้องตามไปอัพเดทข้อมูลตรงนี้ด้วย ฉะนั้น เราจะทราบว่าสมาชิกอยู่ล่าสุดเวลากี่โมง และในกรณีที่ไม่อัพเดทเลย แสดงว่าสมาชิกอาจจะไม่อยู่ หรือปิดหน้าจอไปแล้ว เราจึงใช้วิธีการอัพเดดตรง LoginStatus = '0' อัตโนมัติเมื่อไม่มีการคลิกไปยังหน้าต่าง ๆ ภายในเวลาที่กำหนด
$intRejectTime = 20; // Minute
$sql = "UPDATE member SET LoginStatus = '0', LastUpdate = '0000-00-00 00:00:00' WHERE 1 AND DATE_ADD(LastUpdate, INTERVAL $intRejectTime MINUTE) <= NOW() ";
$query = mysqli_query($con,$sql);
จาก Code นี้จะมีการอัพเดท LoginStatus = '0' เมื่อสมาชิกคนดังกล่าวไม่ได้กระทำกับหน้าต่าง ๆ ภายใน 10 นาที โดยคำสั่งนี้เราอาจจะแทรกไว้ตรงหน้า Login หรือส่วนใดของเว็บที่เรียกใช้งานบ่อย ๆ เพื่อจะเป็นการ Clear สมาชิกที่ไม่ได้ Logout
Code เต็ม ๆ ทั้งหมด
connect.php (ไฟล์สำหรับเชื่อมต่อกับ MySQL Database)
<?php
ini_set('display_errors', 1);
error_reporting(~0);
$serverName = "localhost";
$userName = "root";
$userPassword = "root";
$dbName = "login";
$con = mysqli_connect($serverName,$userName,$userPassword,$dbName);
if (mysqli_connect_errno())
{
echo "Database Connect Failed : " . mysqli_connect_error();
exit();
}
//*** Reject user not online
$intRejectTime = 20; // Minute
$sql = "UPDATE member SET LoginStatus = '0', LastUpdate = '0000-00-00 00:00:00' WHERE 1 AND DATE_ADD(LastUpdate, INTERVAL $intRejectTime MINUTE) <= NOW() ";
$query = mysqli_query($con,$sql);
?>
login.php (หน้า Login เป็น Form รับ Username และ Password)
<html>
<head>
<title>ThaiCreate.Com Tutorials</title>
</head>
<body>
<form name="form1" method="post" action="check_login.php">
Login<br>
<table border="1" style="width: 300px">
<tbody>
<tr>
<td> Username</td>
<td>
<input name="txtUsername" type="text" id="txtUsername">
</td>
</tr>
<tr>
<td> Password</td>
<td><input name="txtPassword" type="password" id="txtPassword">
</td>
</tr>
</tbody>
</table>
<br>
<input type="submit" name="Submit" value="Login">
</form>
</body>
</html>
check_login.php (ไฟล์ทำหน้าที่ตรวจสอบการ Login)
<?php
session_start();
require_once("connect.php");
$strUsername = mysqli_real_escape_string($con,$_POST['txtUsername']);
$strPassword = mysqli_real_escape_string($con,$_POST['txtPassword']);
$strSQL = "SELECT * FROM member WHERE Username = '".$strUsername."'
and Password = '".$strPassword."'";
$objQuery = mysqli_query($con,$strSQL);
$objResult = mysqli_fetch_array($objQuery);
if(!$objResult)
{
echo "Username and Password Incorrect!";
exit();
}
else
{
if($objResult["LoginStatus"] == "1")
{
echo "'".$strUsername."' Exists login!";
exit();
}
else
{
//*** Update Status Login
$sql = "UPDATE member SET LoginStatus = '1' , LastUpdate = NOW() WHERE UserID = '".$objResult["UserID"]."' ";
$query = mysqli_query($con,$sql);
//*** Session
$_SESSION["UserID"] = $objResult["UserID"];
session_write_close();
//*** Go to Main page
header("location:page1.php");
}
}
mysqli_close($con);
?>
page1.php (หน้าที่ Login ผ่านแล้ว จะแสดงหน้านี้)
<?php
session_start();
require_once("connect.php");
if(!isset($_SESSION['UserID']))
{
echo "Please Login!";
exit();
}
//*** Update Last Stay in Login System
$sql = "UPDATE member SET LastUpdate = NOW() WHERE UserID = '".$_SESSION["UserID"]."' ";
$query = mysqli_query($con,$sql);
//*** Get User Login
$strSQL = "SELECT * FROM member WHERE UserID = '".$_SESSION['UserID']."' ";
$objQuery = mysqli_query($con,$strSQL);
$objResult = mysqli_fetch_array($objQuery,MYSQLI_ASSOC);
?>
<html>
<head>
<title>ThaiCreate.Com Tutorials</title>
</head>
<body>
Welcome to Page 1 ! <br>
<table border="1" style="width: 300px">
<tbody>
<tr>
<td width="87"> Username</td>
<td width="197"><?php echo $objResult["Username"];?>
</td>
</tr>
<tr>
<td> Name</td>
<td><?php echo $objResult["Name"];?></td>
</tr>
</tbody>
</table>
<br>
<a href="page2.php">Page 2</a><br>
<br>
<a href="logout.php">Logout</a>
</body>
</html>
<?
mysqli_close($con);
?>
page2.php (หน้าอื่น ๆ ในระบบสมาชิก)
<?php
session_start();
require_once("connect.php");
if(!isset($_SESSION['UserID']))
{
echo "Please Login!";
exit();
}
//*** Update Last Stay in Login System
$sql = "UPDATE member SET LastUpdate = NOW() WHERE UserID = '".$_SESSION["UserID"]."' ";
$query = mysqli_query($con,$sql);
//*** Get User Login
$strSQL = "SELECT * FROM member WHERE UserID = '".$_SESSION['UserID']."' ";
$objQuery = mysqli_query($con,$strSQL);
$objResult = mysqli_fetch_array($objQuery,MYSQLI_ASSOC);
?>
<html>
<head>
<title>ThaiCreate.Com Tutorials</title>
</head>
<body>
Welcome to Page 2 ! <br>
<table border="1" style="width: 300px">
<tbody>
<tr>
<td width="87"> Username</td>
<td width="197"><?php echo $objResult["Username"];?>
</td>
</tr>
<tr>
<td> Name</td>
<td><?php echo $objResult["Name"];?></td>
</tr>
</tbody>
</table>
<br>
<a href="page1.php">Page 1</a><br>
<br>
<a href="logout.php">Logout</a>
</body>
</html>
<?
mysqli_close($con);
?>
logout.php (หน้า Logout ออกจากระบบ)
<?php
session_start();
require_once("connect.php");
//*** Update Status
$sql = "UPDATE member SET LoginStatus = '0', LastUpdate = '0000-00-00 00:00:00' WHERE UserID = '".$_SESSION["UserID"]."' ";
$query = mysqli_query($con,$sql);
session_destroy();
header("location:login.php");
?>
ทดสอบการทำงาน
![2 2](https://www.thaicreate.com/upload/stock/20141007113739.jpg?v=1001)
หน้าแรกสำหรับการ Login
![3 3](https://www.thaicreate.com/upload/stock/20141007113745.jpg?v=1001)
เมื่อ Login ผ่าน
![4 4](https://www.thaicreate.com/upload/stock/20141007113749.jpg?v=1001)
หลังจากที่ Login ผ่านแล้ว จะมีการ Update สถานะว่า User นี้ได้มีการ Login แล้ว
![5 5](https://www.thaicreate.com/upload/stock/20141007113754.jpg?v=1001)
เมื่อมีการ Logout ออกจากระบบ จะมีการ Clear สถานะ
มีการ Clear สถานะของการ Update
สำหรับตัวอย่างการทำ Register Form หรือ ฟอร์มสำหรับสมัครสมาชิก สามารถอ่านได้ที่
Go to : PHP MySQL กับ Register Form ทำระบบ สมัครสมาชิกเก็บข้อมูลง่าย ๆ เช่น รหัสสมาชิก (Username) รหัสผ่าน (Password)
Go to : PHP Member Register and Email Activation
บทความที่เกี่ยวข้อง
Go to : PHP Authentication : การใช้งาน Authentication ตรวจสอบสถานะการ Login
Go to : PHP Session ($_SESSION,$HTTP_SESSION_VARS)
Go to : PHP MySQL : Connect to MySQL Database ภาษา PHP กับฐานข้อมูล MySQL
|
|
|
By : |
TC Admin
|
|
Article : |
บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ |
|
Score Rating : |
![](/images/resource/startrue.gif) |
|
Create Date : |
2014-10-07 |
|
Download : |
No files |
|
Sponsored Links |
|
|
|
|
|
|