從資料表建立、HTML 表單、PHP 驗證邏輯到 Session 管理,提供一個完整可運作的登入系統參考架構。
CREATE TABLE IF NOT EXISTS `backend_user` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, `group_id` int(11) NOT NULL DEFAULT '0', `login` varchar(255) NOT NULL DEFAULT '', `password` varchar(255) NOT NULL DEFAULT '', `last_logon` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2; -- 預設管理員帳號:admin / 123456 (MD5: e10adc3949ba59abbe56e057f20f883e) INSERT INTO `backend_user` (`user_id`, `group_id`, `login`, `password`, `last_logon`) VALUES (1, 0, 'admin', 'e10adc3949ba59abbe56e057f20f883e', '0000-00-00 00:00:00');
<?php session_start(); // 通用工具函式 if (!function_exists("getpost")) { function getpost() { if (count($_POST)) { foreach ($_POST as $key => $value) { $GLOBALS[$key] = $value; } } } } if (!function_exists("getget")) { function getget() { if (count($_GET)) { foreach ($_GET as $key => $value) { $GLOBALS[$key] = $value; } } } } if (!function_exists("escapeit")) { function escapeit($text) { if (get_magic_quotes_gpc()) $text = stripslashes($text); if (!is_numeric($text)) $text = mysql_real_escape_string($text); return $text; } } getpost(); // 取得 POST 資料 // 登入驗證 $rs = $db->query("SELECT * FROM `backend_user` WHERE BINARY `login` = '" . escapeit($login) . "' AND BINARY `password` = '" . md5($password) . "'"); if (mysql_num_rows($rs) > 0) { $row = $db->fetch_array($rs); $_SESSION["smartinfo_sysid"] = $row["user_id"]; $_SESSION["smartinfo_syslogin"] = $row["login"]; // 更新最後登入時間 $db->query("UPDATE `backend_user` SET `last_logon` = '" . date("Y-m-d H:i:s") . "' WHERE `id` = '" . $row["id"] . "'"); header("Location: index2.php"); } else { header("Location: index.php?status=fail"); } ?>
<form action="login.php" method="post" name="login" id="login" onsubmit="return checkvalid(this);"> <table width="350" align="center" cellpadding="0" cellspacing="0" class="tableborder"> <tr><td align="center"><img src="images/logo.jpg" width="198" height="61"></td></tr> <tr><td> <table width="85%" align="center"> <tr> <td style="font-size:12px"><b>Login ID:</b></td> <td align="right"><input name="login" type="text" style="width:220px"></td> </tr> <tr> <td style="font-size:12px"><b>Password:</b></td> <td align="right"><input name="password" type="password" style="width:220px" size="2" maxlength="15"></td> </tr> <tr> <td></td> <td align="right" valign="top"><input type="submit" name="submit" id="submit" value="Login" class="button"></td> </tr> </table> </td></tr> </table> </form>
getpost()、getget() 等將超全域變數註冊為全域變數的危險做法autocomplete="current-password" 協助瀏覽器管理<?php // 現代化登入驗證範例 session_start(); require 'pdo_connect.php'; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $login = trim($_POST['login'] ?? ''); $password = $_POST['password'] ?? ''; if ($login && $password) { $stmt = $pdo->prepare("SELECT user_id, login, password FROM backend_user WHERE login = ?"); $stmt->execute([$login]); $user = $stmt->fetch(); if ($user && password_verify($password, $user['password'])) { session_regenerate_id(true); $_SESSION['user_id'] = $user['user_id']; $_SESSION['login'] = $user['login']; $pdo->prepare("UPDATE backend_user SET last_logon = NOW() WHERE user_id = ?")->execute([$user['user_id']]); header("Location: index2.php"); exit; } } $error = "帳號或密碼錯誤"; } ?>