[PHP] สร้าง log in แบบแบ่งสถานะ(USER,ADMIN)ยังไงคะ?
สวัสดีค่ะ พอดีมีเรื่องอยากจะถาม เราลองหาโค้ดต่างๆจากูเกิ้ลเเล้วปรากฎว่าเราทำแล้วรันไม่ได้ หลายๆเว็บทำแบบสร้าง database ใน php (เราใช้โปรแกรม NETBEAN) เลย แต่ของเราสร้าง database ใน MYSQL (xampp) ซึ่งทำให้เรางง เพราะเราจะสร้าง php มาอีกหน้านึงเพื่อดึงข้อมูลมาจาก database แล้วก็ include หน้าพวกนี้ไปใช้ เราไม่แน่ใจว่าต้อง include ยังไง ตรงส่วนไหน
ตารางชื่อ login_tb มี 4 ฟิลด์
- login_id
- login_username
- login_password
- login_status
เราแยกสถานะไว้ 3 สถานะ(login_status) ตั้งค่าใน database เป็น 1,2,3
หน้า login แค่สร้าง input ต่างๆขึ้นมาใช่ไหมคะ?
ทีนี้เรามีปัญหาที่หน้า check_login ที่ใช้ดูสถานะใน status ในการจำกัดการเข้าถึงข้อมูล ืำยังไงก็ error มันชอบ error ตรง mysqli_query
งงมากค่ะ
Code (PHP)
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<?php
session_start();
include 'dbconfig.php';
$strSQL = "SELECT * FROM login_tb WHERE login_username = '".mysql_real_escape_string($_POST['username'])."'
and login_password = '".mysql_real_escape_string($_POST['password'])."'";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
if(!$objResult)
{
echo "Username and Password Incorrect!";
}
else
{
$_SESSION["login_id"] = $objResult["login_id"];
$_SESSION["login_status"] = $objResult["login_status"];
session_write_close();
if($objResult["login_status"] == 1)
{
header("location:admin.php");
}
else
{
header("location:user.php");
}
}
mysql_close();
?>
?>
</body>
</html>
อันนี้ติดตรง $strSQL = "SELECT * FROM login_tb WHERE login_username = '".mysql_real_escape_string($_POST['username'])."'
and login_password = '".mysql_real_escape_string($_POST['password'])."'";
ขึ้น error ว่า Fatal error: Uncaught Error: Call to undefined function mysql_real_escape_string() in C:\xampp\htdocs\PhpProject5\check_login.php:17 Stack trace: #0 {main} thrown in C:\xampp\htdocs\PhpProject5\check_login.php on line 17
เราทำไว้หลายแบบมากๆๆๆ
Code (PHP)
<?php
require 'connectdb.php';
$login_username = mysqli_real_escape_string($dbcon,$_POST['username']);
$login_password = mysqli_real_escape_string($dbcon,$_POST['password']);
$salt = 'tikde78uj4ujuhlaoikiksakeidke';
$hash_login_password = hash_hmac('sha256', $login_password, $salt);
$sql = "SELECT * FROM tb_login WHERE login_username=? AND login_password=?";
$stmt = mysqli_prepare($dbcon, $sql);
mysqli_stmt_bind_param($stmt,"ss", $login_username,$hash_login_password);
mysqli_execute($stmt);
$result_user = mysqli_stmt_get_result($stmt);
if ($result_user->num_rows == 1) {
session_start();
$row_user = mysqli_fetch_array($result_user,MYSQLI_ASSOC);
$_SESSION['login_id'] = $row_user['login_id'];
$_SESSION['login_status'] = $row['login_status'];
if($_SESSION["login_status"]==0){ //ถ้าเป็น admin ให้กระโดดไปหน้า admin_page.php
header("Location: main1.php");
}
else if ($_SESSION["login_status"]==2){ //ถ้าเป็น admin ให้กระโดดไปหน้า admin_page.php
header("Location: main2.php");
}
else if ($_SESSION["login_status"]==3){ //ถ้าเป็น admin ให้กระโดดไปหน้า admin_page.php
header("Location: main3.php");
}
} else {
echo "ผู้ใช้หรือรหัสผ่านไม่ถูกต้อง";
}
อันนี้พอเข้าแบบ admin ก็ลิ้งค์ไป main1 อย่างเดียวเลย เหมือนมันดูตรง 0 เป็นหลักว่าอยู่ตรงไหน ช่วยชี้แนะทีค่ะว่าควรแก้ตรงไหน หรือจะสร้างมาใหม่เลยก็ได้ แงงงง ขอความกรุณาด้วยค่ะTag : PHP, MySQL
Date :
2017-12-06 20:34:02
By :
ny2003
View :
11633
Reply :
17
https://www.thaicreate.com/php/forum/095986.html
ให้ลอง var_dump($_SESSION["login_status"]); ออกมาดูก่อน ปิด redirect ไว้ให้หมด แล้วลอง login user แต่ละอันที่มีสถานะต่างกันดูว่าค่าถูกต้องไหม ถ้าค่าถูกมันก็ไปตามเงื่อนไขนั้นนั่นแหละ
ประวัติการแก้ไข 2017-12-06 22:13:50
Date :
2017-12-06 22:10:06
By :
mr.v
มันใช้ยังไงคะ? ต้องไปแทนตรงไหน?
Date :
2017-12-08 22:04:22
By :
ny2003
Code (PHP)
<?php
session_start();
require 'connectdb.php';
$login_username = mysqli_real_escape_string($dbcon,$_POST['username']);
$login_password = mysqli_real_escape_string($dbcon,$_POST['password']);
$salt = 'tikde78uj4ujuhlaoikiksakeidke';
$hash_login_password = hash_hmac('sha256', $login_password, $salt);
$sql = "SELECT * FROM tb_login WHERE login_username=? AND login_password=?";
$stmt = mysqli_prepare($dbcon, $sql);
mysqli_stmt_bind_param($stmt,"ss", $login_username,$hash_login_password);
mysqli_execute($stmt);
$result_user = mysqli_stmt_get_result($stmt);
if ($result_user->num_rows == 1) {
$row_user = mysqli_fetch_array($result_user,MYSQLI_ASSOC);
$_SESSION['login_id'] = $row_user['login_id'];
$_SESSION['login_status'] = $row['login_status'];
if($_SESSION["login_status"]==0){ //ถ้าเป็น admin ให้กระโดดไปหน้า admin_page.php
header("Location: main1.php");
}
else if ($_SESSION["login_status"]==2){ //ถ้าเป็น admin ให้กระโดดไปหน้า admin_page.php
header("Location: main2.php");
}
else if ($_SESSION["login_status"]==3){ //ถ้าเป็น admin ให้กระโดดไปหน้า admin_page.php
header("Location: main3.php");
}
} else {
echo "ผู้ใช้หรือรหัสผ่านไม่ถูกต้อง";
}
Date :
2017-12-09 04:09:31
By :
Manussawin
แล้วต้องแทนในส่วนไหนคะ? ก่อน if หรือภายใน if เลย?
Date :
2017-12-10 14:48:31
By :
ny2003
ถ้าใช้ mysqli_prepare ก็ไม่ต้องใช้ real_escape_string มันจะซ้ำซ้อน
และถ้าไม่จำเป็นต้องสร้างตัวแปรใหม่ ก็ให้ใช้ ตัวแปร global ที่ได้มาตรงๆ จะช่วยประหยัดหน่วยความจำ
เขียนด้วย oop จะเข้าใจง่ายและไม่หลง function สั้นกว่าด้วย
Code (PHP)
<?php
// connectdb.php
$dbcon = new mysqli('localhost','test','test','test');
if($dbcon->connect_error){
die('Connect Error: ' . $dbcon->connect_error);
}
?>
Code (PHP)
// ตรวจสอบตัวแปร post
if(!(isset($_POST['username']) && isset($_POST['password']))){
die('Login error');
}
require 'connectdb.php';
$hash_paswd = hash_hmac('sha256', $_POST['password'], 'tikde78uj4ujuhlaoikiksakeidke');
$stmt = $dbcon->prepare("SELECT * FROM tb_login WHERE login_username=? AND login_password=? ");
$stmt->bind_param("ss", $_POST['username'], $hash_paswd);
$stmt->execute();
$rs=$stmt->get_result();
if ($rs->num_rows == 1) {
session_start();
$row = $rs->fetch_object();
$_SESSION['login_id'] = $row->login_id;
$st=($_SESSION['login_status'] = $row->login_status) + 1;
if(in_array($st,array(1,2,3))){
//ถ้าเป็น admin ให้กระโดดไปหน้า admin_page.php
header('location: main'.$st.'.php');
}
}
echo "ผู้ใช้หรือรหัสผ่านไม่ถูกต้อง";
ประวัติการแก้ไข 2017-12-10 17:28:14 2017-12-10 17:28:52
Date :
2017-12-10 17:14:40
By :
Chaidhanan
ขอโทษนะคะ หนูเขียนตรง // ผิดเองที่เป็น admin 3 บรรทัดเลย คือมันจะแยกสถานะกันอ่ะค่ะ เป็น admin teacher student ขอโทษที่ไม่ตรวจดูให้ดี คือมันต้องมี 3 เงื่อนไข มี 3 if แล้วก็ลิ้งค์ไป 3 หน้าในแต่ละเงื่อนไข แอดมินลิ้งค์ไปแอดมิน ครูลิ้งค์ไปครู แล้วหนูต้องลิ้งค์ยังไงคะ? ถ้าใช้คำสั่งนั้น
ลองใช้โค้ดจากเว็บนี้ตรงส่วน query ก็มักจะติดปัญหา ไม่ทราบว่าเพราะอะไรคะ?
คือไม่ได้สร้าง database ใน php แต่ไปสร้างใน mysql พอใช้คำสั่ง include ดึงหน้าที่เชื่อมดาต้าเบตไว้มาทำไมถึงยังมีปัญหา?
Date :
2017-12-10 17:50:50
By :
ny2003
Code (PHP)
if(in_array($st,array(1,2,3))){
//ถ้าเป็น admin ให้กระโดดไปหน้า admin_page.php
header('location: main'.$st.'.php');
}
แก้เป็น
Code (PHP)
switch($st){
case 1: header('location: admin.php'); break;
case 2: header('location: teacher.php'); break;
case 3: header('location: student.php'); break;
default: die('Error');
}
Date :
2017-12-10 18:03:19
By :
Chaidhanan
ขอโทษนะคะ คือมันไม่ลิ้งค์ไปให้ตรง case 3 น่ะค่ะ พอล็อคอินไปดันขึ้นว่า error หมายความว่าไงคะ? แล้วต้องแก้ตรงไหนถึงจะหาย? มันลิ้งให้ไม่ตรง page อ่ะค่ะ แล้วล็อคอินไป 3 สถานะ อันแรกตรงแล้ว อันที่สองไม่ตรงลิ้งค์ อันที่สามขึ้น error ค่ะ
ประวัติการแก้ไข 2017-12-10 18:26:29
Date :
2017-12-10 18:22:33
By :
ny2003
เอาโค๊ดที่แก้ไขแล้วมาดูครับ ว่าแก้อะไรไปบ้าง
Date :
2017-12-10 19:32:05
By :
Chaidhanan
Code (PHP)
<?php
if(!(isset($_POST['username']) && isset($_POST['password']))){
die('Login error');
}
require 'connectdb.php';
$hash_paswd = hash_hmac('sha256', $_POST['password'], 'tikde78uj4ujuhlaoikiksakeidke');
$stmt = $dbcon->prepare("SELECT * FROM tb_login WHERE login_username=? AND login_password=? ");
$stmt->bind_param("ss", $_POST['username'], $hash_paswd);
$stmt->execute();
$rs=$stmt->get_result();
if ($rs->num_rows == 1) {
session_start();
$row = $rs->fetch_object();
$_SESSION['login_id'] = $row->login_id;
$st=($_SESSION['login_status'] = $row->login_status) + 1;
switch($st){
case 1: header('location: main1.php'); break;
case 2: header('location: main2.php'); break;
case 3: header('location: main3.php'); break;
default: die('Error');
}
}
echo "ผู้ใช้หรือรหัสผ่านไม่ถูกต้อง";
?>
แล้วก็สร้างหน้า connectdb ไว้อีกหน้านึงอ่ะค่ะ
Date :
2017-12-10 20:07:06
By :
ny2003
Code (PHP)
// บันทัด 13
$row = $rs->fetch_object();
// เพิ่มตรงนี้เพื่อตรวจสอบ แล้วเอา report มาดูหน่อยครับ
var_dump($row); exit;
Date :
2017-12-10 21:05:52
By :
Chaidhanan
report นี่คือหลังจากที่รันรึเปล่าคะ?
Date :
2017-12-10 21:24:08
By :
ny2003
ผมเอามาลองทดสอบดูก็ถูกต้องนะครับ
Code (PHP)
<?php
$url='';
if(isset($_POST['username'])){
// ถ้าใช้ mysql_prepare ก็ไม่ต้องใช้ real_escape_string
// ตรวจสอบตัวแปร post
if(!(isset($_POST['username']) && isset($_POST['password']))){
die('Login error');
}
require 'connectdb.php';
$hash_paswd = hash_hmac('sha256', $_POST['password'], 'tikde78uj4ujuhlaoikiksakeidke');
$stmt = $dbcon->prepare("SELECT * FROM tb_login WHERE (login_username=? AND login_password=? )");
$stmt->bind_param("ss", $_POST['username'], $hash_paswd);
$stmt->execute();
$rs=$stmt->get_result();
if ($rs->num_rows == 1) {
session_start();
$row = $rs->fetch_object();
//var_dump($row);exit;
$_SESSION['login_id'] = $row->login_id;
$st=($_SESSION['login_status'] = $row->login_status) + 1;
switch($st){
case 1: $url = "admin_page.php"; break;
case 2: $url = "techer_page.php"; break;
case 3: $url = "student_page.php"; break;
default: $url = '--';
}
}
}
?>
<!doctype html>
<html>
<head>
<title>Test Last query</title>
<meta charset="utf-8">
</head>
<body>
url: <?=$url?><br>
<form action="" method="post" >
<input type=text name=username
value="<?=(isset($_POST['username']) ? $_POST['username'] : '')?>" ><br/>
<input type=password name=password
value="<?=(isset($_POST['password'])? $_POST['password'] : '')?>" ><br/>
<button>Login</button>
</form>
</body>
</html>
ประวัติการแก้ไข 2017-12-10 22:18:40
Date :
2017-12-10 22:13:53
By :
Chaidhanan
ได้แล้วค่ะๆ ขอบพระคุณเป็นอย่างสูง
Date :
2017-12-10 22:41:23
By :
ny2003
งงง
Date :
2018-08-19 23:14:51
By :
hh
ขออนุญาตสอบถามครับ แนวคิดผมคือ เมื่อ login ในสถานะ superadmin แล้ว สร้าง ผู้ใช้ สถานะ admin หลายๆ อัน และ admin 1 สิทธิ์ สามารถสร้าง user ได้ ซึ่ง user 1 สิทธิ์ เมื่อทำอะไรต้องอยุ่ภายใต้ group ของ admin ที่สร้าง อยากทราบว่า ทำอย่างไรครับ รบกวนตอบกลับ ทาง email : [email protected]
ู้
Date :
2021-03-27 19:48:20
By :
อาทิตย์
กำหนดชื่อวิลิสมาหราจัง 55555
usertype ที่เคยใช้ admin manager assistance staff ก็มี trustee ตามลำดับชั้น
เพิ่มtrustee สามารถ create user เข้าไปอีกอัน พอสร้าง ก็สามารถ กำหนด สิทธิ์ ที่มีให้กับ user ใหม่ได้
หลักการก็มีแค่นั้น ที่เหลือก้ใส่โค๊ด เข้าไป
advance code แบบนี้ ถ้าอยากได้โค๊ดโดยไม่ต้องเขียนเอง หรือเสียเงิน ก็ขยันหาเอาหน่อย
เฉพาะโมดูลนี้ ก็หลายตังอยู่นะครับ
Date :
2021-03-28 07:01:41
By :
Chaidhanan
Load balance : Server 03