สวัสดีครับนักเรียน มาถึงบทที่สำคัญที่สุดบทหนึ่งแล้ว! ต่อให้เว็บเราทำ CRUD เก่งแค่ไหน
ถ้าไม่มีระบบ Login → ใครก็เข้ามาแก้ข้อมูลได้หมด ถือว่ายังไม่ใช่ระบบจริง
บทนี้ครูจะพาทุกคนสร้างระบบที่เว็บไซต์แทบทุกแห่งต้องมี
password_hash()password_verify()$_SESSION จำสถานะ Loginสิ่งที่ครูย้ำเสมอ
“ห้ามเก็บรหัสผ่านเป็นตัวอักษรธรรมดาเด็ดขาด”
ให้ช่อง password ยาวพอสำหรับ hash
ALTER TABLE users
MODIFY password VARCHAR(255) NOT NULL;
จุดสำคัญคือการเข้ารหัสรหัสผ่าน
<?php
require_once 'db_config.php';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$user = mysqli_real_escape_string($conn, $_POST['username']);
$pass = $_POST['password'];
// หัวใจความปลอดภัย
$hashed_password =
password_hash($pass, PASSWORD_DEFAULT);
$sql = "INSERT INTO users
(username, password)
VALUES
('$user', '$hashed_password')";
if (mysqli_query($conn, $sql)) {
echo "สมัครสมาชิกสำเร็จ!
<a href='login.php'>ไปหน้าเข้าสู่ระบบ</a>";
}
}
?>
ต่อให้ฐานข้อมูลหลุด แฮกเกอร์ก็อ่านรหัสจริงไม่ได้
Session = ป้ายชื่อผู้ใช้ชั่วคราว
<?php
session_start(); // ต้องอยู่บนสุด!
require_once 'db_config.php';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$user = mysqli_real_escape_string($conn, $_POST['username']);
$pass = $_POST['password'];
$sql = "SELECT * FROM users
WHERE username = '$user'";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
if ($row &&
password_verify($pass, $row['password'])) {
// จำว่าใครล็อกอินอยู่
$_SESSION['user_id'] = $row['id'];
$_SESSION['username'] = $row['username'];
header("Location: dashboard.php");
} else {
echo "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง";
}
}
?>
เด็กมักงง ทำไมไม่เทียบรหัสตรง ๆ?
เพราะ hash เปลี่ยนทุกครั้ง → ต้องใช้ verify เท่านั้น
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit();
}
?>
<h1>
ยินดีต้อนรับคุณ
<?php echo $_SESSION['username']; ?>
</h1>
<a href="logout.php">ออกจากระบบ</a>
นี่คือ “ประตูยาม” ของเว็บเรา
<?php
session_start();
session_destroy();
header("Location: login.php");
exit();
?>
ตอนนี้นักเรียนมีเว็บระดับใช้งานจริงแล้ว
นี่คือพื้นฐานที่บริษัทใช้จริง ถ้าต่อยอดอีกนิดก็ทำโปรเจกต์จบได้สบายมาก
โปรแกรมเมอร์ไม่ได้เก่งเพราะจำได้ แต่เก่งเพราะ “ลงมือทำซ้ำ ๆ”
ภูมิใจในตัวเองได้เลยครับ