เอาเป็น code ก่อนนะครับ
Login.php
<form method=post action=signin.php>
User : <input type=text name=useradmin id=useradmin><br>
Pass : <input type=password name=passadmin id=passadmin><br>
<input type=submit value=OK>
</form>
signin.php
<?php
session_start();
require_once "connect.php";
$sql = "select * from admin where useradmin = '$_POST[useradmin]' and passadmin = '$_POST[passadmin]'";
$dbquery = mysql_db_query($db, $sql);
$num_rows = mysql_num_rows($dbquery);
$rowLogin = mysql_fetch_array($dbquery);
if($num_rows == 1){
$_SESSION['useradmin'] = $rowLogin['useradmin'];
echo "<meta http-equiv='refresh' content='0;URL=home.php'>";
}else{
echo "<meta http-equiv='Content-Type' content='text/html; charset=tis-620' />";
echo "<script language='javascript'>alert('invalid username & password');</script>";
echo "<meta http-equiv='refresh' content='0;URL=Login.php'>";
}
?>
home.php
<?
@session_start();
ob_start();
$useradmin = $_SESSION["useradmin"];
if(empty($useradmin))
{
echo "<script>alert('หน้านี้จำกัดเฉพาะ Admin เท่านั้น');history.back();</script>";
exit();
}
?>
ปัญหาตอนนี้คือ login ด้วย user , pass ถูกแล้ว (ย้ำว่าถูกต้องแน่นอนครับ)
มันผ่านไปไฟล์ home.php เลยครับ และขึ้น หน้านี้จำกัดเฉพาะ Admin เท่านั้น ทั้ง ๆที่เคยเขียนอย่างนี้มาก่อน
หรือว่ามันเกี่ยวกับ host ครับ
รบกวนผู้รู้ช่วยทีครับ
ก่อนที่จะใช้ meta refresh ไปหน้าอื่น
ให้ลอง echo $rowLogin['useradmin'] ออกมาก่อนว่ามีค่าอะไรหรือเปล่าครับ
if(!$_SESSION["useradmin"]){
echo "<script>alert('หน้านี้จำกัดเฉพาะ Admin เท่านั้น');history.back();</script>";
exit();
}
แบบนี้น่าจะดีกว่าน่ะครับ ลองดูครับ โค้ดสั้นกวาด้วย ^^
เซ็ต error_reporting(E_ALL);
แล้วลองทำตามที่คุณ vii แนะนำดูครับ (อย่าพึ่ง redirect หน้า ให้ตรวจสอบดูว่า session ที่ใช้ตรวจสอบเงื่อยไขมีการ assign ค่าตามที่เราต้องการหรือปล่าว)
ลองเช็คว่า username/password duplicate ใน database หรือป่าว
เพราะถ้ามัน duplicate เมื่อไหร่ num rows จะกลายเป็น 2 แล้วจะไปเข้าอีก condition ทันที
ปล. เพิ่งเห็นกว่ากระทู้นี้ นานแล้ว จขกท คงแก้ได้แล้วมั้ง ป่านนี้ :-X
อ้างถึงจาก: MapTwoZa ใน 02 พฤษภาคม 2013, 04:58:52
ลองเช็คว่า username/password duplicate ใน database หรือป่าว
เพราะถ้ามัน duplicate เมื่อไหร่ num rows จะกลายเป็น 2 แล้วจะไปเข้าอีก condition ทันที
ปล. เพิ่งเห็นกว่ากระทู้นี้ นานแล้ว จขกท คงแก้ได้แล้วมั้ง ป่านนี้ :-X
เจ้าของกระทู้บอกว่ามันผ่านไปหน้า home แล้ว alert แสดงว่าเข้าเงื่อนไขแล้วครับ ไม่มี dup
วิธีเช็ค password กับ username ใน Database ของเจ้าของกระทู้แบบนี้
เสี่ยงต่อการโดน SQL Injection สูงมากๆ ครับ จะโดน hack เอาได้ง่ายๆ
ภาวะเสี่ยงภัย
จริงด้วยแฮะ อ่านไม่ดี ถ้างั้น ต้องไล่ทีละ step ครับ
1. ดู phpinfo ก่อนว่า session enable อยู่ป่าว เช่น สร้าง info.php ขึ้นมาแล้วเข้าไป search หาคำว่า session แล้วดูว่ามัน enable อยู่ป่าว
info.php
<?php
phpinfo();
2.ถ้า Session มัน Enable ไว้ก็ลอง test session ก่อนเลยครับ โดยการสร้างไฟล์ออกมาแบบนี้ แล้ว refresh หลายๆทีดูครับว่ามันแสดงเหมือนเดิมหรือป่าว
session-test.php
<?php
session_start();
echo session_id();
ถ้า ข้อ 1 ข้อ 2 ผ่าน แสดงว่า session ทำงานปรกติครับ ต้องไล่ดู code เรา
3. ใน home.php dump session ออกมาดูครับ
<?
@session_start();
ob_start();
/*
$useradmin = $_SESSION["useradmin"];
if(empty($useradmin))
{
echo "<script>alert('หน้านี้จำกัดเฉพาะ Admin เท่านั้น');history.back();</script>";
exit();
}
*/
var_dump($_SESSION);
ob_flush();
?>
ถ้า session ใน ข้อ 3 ไม่มี key ชื่อ useradmin แสดงว่า signin.php เฟลครับ
ให้ลองปรับ encode เป็น utf-8 without bom ดู
ถ้ายังไม่หายอีก ตรง num_rows==1 ไม่ต้อง echo meta ครับให้ echo $rowLogin['useradmin'] ออกมาดู
@session_start(); = session ไม่ทำงานครับ ต้องเอา@ ออกครับ
อ้างถึงจาก: dragons_first ใน 02 พฤษภาคม 2013, 08:42:50
@session_start(); = session ไม่ทำงานครับ ต้องเอา@ ออกครับ
เติม @ ข้างหน้า คือ suppresses error / warning ครับ
ทำงานปรกติครับ
ไม่เชื่อลอง
<?php
@session_start();
echo session_id();
แต่ปรกติ ไม่ควรใส่ครับ ถ้าเกิดมัน error มันจะได้แจ้งเตือนว่า header already sent ไรเนี่ยแหละ
ต้องลอง Debug ที่ตัวแปร $rowLogin['useradmin'] กับตัวแปร SESSION แล้วหละครับ
จาก comment ผมอันนี้เลยครับ
http://www.thaiseoboard.com/index.php/topic,316164.msg4397442.html#msg4397442
แล้วผมลองไล่ดู code ไปมาหลายรอบและ
มันไม่มีจุดผิดเลยครับ ชื่อตัวแปลก็ถูกหมด
เลยสรุปแบบนี้ ไปไล่เทสทีละข้อเลย
1. เช็ค phpinfo ถ้า session enable คือ session ทำงานได้
2. test session id ถ้ามันเปลี่ยน แสดงว่า session_start ไม่ทำงาน อาจเกิดจาก cookie ถูก disable ไว้ ทางใดทางหนึ่ง
3. ถ้า 1-2 ทำงานปรกติ เลยขอเดาแบบจริงจังเลยว่า session_start ไม่ติด อาจจะเป็นที่ home.php ก็ได้เพราะใช้ @session_start();
session ไม่ติด แต่ก็ไม่มี error แสดง เลยไม่สามารถดึงข้อมูลใน session ออกมาได้
ไม่ก็เป็นที่ signin.php ครับ
session start ไม่ติด echo error ออกมา แต่ว่า มี echo meta tag ตามมา (ซึ่ง login จะถูกต้องทุกอย่าง เข้าเงื่อนไขถูกต้องทุกอย่าง แต่ session ไม่ได้ถูกบันทึก)
มัน redirect เลยครับ เลยไม่รู้ว่า session start ไม่ติด
ให้ลองปรับ encoding ใน 2 ไฟล์นี้เป็น utf8 without bom ครับ
นอกเหนือจากนี้ คิดไม่ออกและ :wanwan031: