สอบถาม script login หน่อยครับ ว่าทำไมถึงตรวจสอบช้า
รู้สึกตอนตรวจสอบ login มันช้ามากครับ เกิน 10 วิ เลยครับ ช่วยตรวจสอบหน่อยครับ ว่ามันช้าตรงไหนและควรปรับตรงไหน
ปล. เขียนมาก็หลายเว็บแต่มาตายตรง login นี้ รู้สึกเฟลมากๆ ครับ T_T
Code (PHP)
$page = isset($_GET['page']) ? $_GET['page'] : '';
if($page==="customer"){
$urlNew = "order";
} else {
$urlNew = "";
}
$txtUsername = $_POST["username"];
$txtPassword = $_POST["password"];
$rememberme = isset($_POST["rememberme"]) ? $_POST["rememberme"] : 'nocheck';
$txtUsername = $conn->real_escape_string($txtUsername);
$txtPassword = $conn->real_escape_string($txtPassword);
$sql = "SELECT id,password,keySite,admin FROM users WHERE username='$txtUsername'";
$qrySQLi = $conn->query($sql);
if ($qrySQLi->num_rows === 1) {
$objUser = $qrySQLi->fetch_array(MYSQLI_ASSOC);
$hash = $objUser["password"];
$iduser = $objUser["id"];
$keySite = $objUser["keySite"];
if (password_verify("$txtPassword", $hash)) {
if($rememberme==="nocheck"){
setcookie("iduser", $iduser, time() + 86400 , "/"); //86400 = 1 day
setcookie("keySite", $keySite, time() + 86400 , "/"); //86400 = 1 day
} else {
setcookie("iduser", $iduser, time() + (86400 * 365), "/");
setcookie("keySite", $keySite, time() + (86400 * 365), "/");
}
if($objUser["admin"]==="1"){
$sql = "UPDATE `users` SET `lastonline`=NOW(),`online`='1',`timeonline`=NOW() WHERE id = '".$objUser["id"]."'";
$result = $conn->query($sql);
header("location: ./$urlNew");
} else {
$sql = "UPDATE `users` SET `lastonline`=NOW(),`online`='1',`timeonline`=NOW() WHERE id = '".$objUser["id"]."'";
$result = $conn->query($sql);
header("location: ./$urlNew");
}
} else {
header("location: ./login?result=fail");
}
} else {
header("location: ./login?result=fail");
}
Tag : PHP, MySQL
ประวัติการแก้ไข 2018-02-22 11:27:26
Date :
2018-02-22 11:22:41
By :
nutemoza
View :
716
Reply :
7
เป็นที่ Host รึเปล่าครับ Code ปกติดีนะ
Date :
2018-02-22 12:11:20
By :
dudesaranyu
Code ถูกหมดครับ แต่งง?
Code (PHP)
12.
$sql = "SELECT id,password,keySite,admin FROM users WHERE username='$txtUsername'";
// WHERE แค่ username ทำไม ไม่ AND password = '$txtUsername'
// มาเป็น WHERE username='$txtUsername' AND password = '$txtUsername' ";
Date :
2018-02-22 12:28:14
By :
Hararock
ปัญหาหลักก็ตาม 1
วิธิการ optimize ข้างล่างจะช่วยได้ถ้าข้อมูลเยอะมากๆ
1 ถ้าใช้คำสั่ง time หลายครั้ง ให้ จับใส่ ตัวแปร ไว้ อย่างเรียกใช้คำสั่ง time() บ่อยๆ เพราะถ้ายุ่งกับ systime บ่อยๆ จะช้่า และเวลาจะเพี้ยนไว
2 หันมาใช้คำสั่ง prepare แล้วเลิกใช้ real_escape_string สั้นกว่า ไวกว่า
3 ใส่ index ให้ username
4 ต้องการ result แค่ record เดียว ใส่ limit 1 ใน statement ด้วย
5 ลดการใช้ตัวแปรพร่ำเพรื่อ
ตัวอย่างการ optimize code
Code (PHP)
<?php
define('cur_time', time()); // เก็บเวลาไว้ในตัวแปร อย่าไปยุ่งกับ systime มากนัก ทำให้ช้า เวลาเพี้ยน
$page = isset($_GET['page']) ? $_GET['page'] : '';
if($page==="customer"){
$urlNew = "order";
} else {
$urlNew = "";
}
$txtUsername = $_POST["username"];
$txtPassword = $_POST["password"];
$rememberme = isset($_POST["rememberme"]) ? $_POST["rememberme"] : 'nocheck';
// ใช้ prepare ก็ไม่ต้องใช้ real_escape_string
$sql = "SELECT id,password,keySite,admin FROM users WHERE username=? limit 1 ";// ใส่ limit 1 เพื่อบอกว่าเจอ แล้ว ก็ให้หยุดไม่ต้องหาอีก
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $txtUsername);
if(!$stmt->execute()) die("เกิดข้อผิดพลาด บีนทัด 14 <br>" . print_r($stmt->error_list,true));
$qrySQLi = $stmt->get_result();
if ($qrySQLi->num_rows === 1) {
$objUser = $qrySQLi->fetch_object();
if (password_verify("$txtPassword", $objUser->password)) {
if($rememberme==="nocheck"){
setcookie("iduser", $objUser->id, cur_time + 86400 , "/"); //86400 = 1 day
setcookie("keySite", $objUser->keySite, cur_time + 86400 , "/"); //86400 = 1 day
} else {
setcookie("iduser", $objUser->id, cur_time + (86400 * 365), "/");
setcookie("keySite", $objUser->keySite, cur_time + (86400 * 365), "/");
}
// code ซ้ำซ้อน
//if($objUser->admin==="1"){
//$sql = 'UPDATE `users` SET `lastonline`=NOW(),`online`=1,`timeonline`=NOW() WHERE id = '.$objUser->id;
//} else {
$sql = 'UPDATE `users` SET `lastonline`=NOW(),`online`=1,`timeonline`=NOW() WHERE id = '.$objUser->id;
//}
$conn->query($sql) or die($sql.'<br>'.$conn->error);
header("location: ./$urlNew");
} else {
header("location: ./login?result=fail");
}
} else {
header("location: ./login?result=fail");
}
ปล. cookie จับเข้าไว้ใน array จะได้อ้างอิง cookie เดียว เวลาเดียว server ไม่ต้องทำงานเพิ่ม
ประวัติการแก้ไข 2018-02-22 13:01:16 2018-02-22 13:06:00
Date :
2018-02-22 12:52:43
By :
Chaidhanan
ขอบคุณทุกท่านครับผม DÜd€ :3, HaraRock, Chaidhanan เดี่ยวจะลองแก้ไขตามที่ท่าน Chaidhanan บอกนะครับ ผลเป็นไงจะมาตอบอีกทีนะครับ
Date :
2018-02-22 15:07:07
By :
nutemoza
Load balance : Server 05