|
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');
ในการออกแบบฐานข้อมูลเราจะเพิ่มฟิวด์ที่ชื่อว่า
- 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
//*** 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");
?>
ทดสอบการทำงาน
หน้าแรกสำหรับการ Login
เมื่อ Login ผ่าน
หลังจากที่ Login ผ่านแล้ว จะมีการ Update สถานะว่า User นี้ได้มีการ Login แล้ว
เมื่อมีการ 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 : |
|
|
Create Date : |
2014-10-07 |
|
Download : |
No files |
|
Sponsored Links |
|
|
|
|
|
|