首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 登入系統完整實作(資料庫 + 程式 + 介面)

     編輯:PHP 相關知識

入門級 PHP 登入系統完整範例

從資料表建立、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 驗證邏輯

<?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");
}
?>

HTML 登入表單

<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>

安全性重構建議(現代化寫法)

  • 資料庫操作改用 PDO Prepared Statements,完全防止 SQL 注入
  • 密碼雜湊改用 password_hash() / password_verify(),棄用 MD5
  • 移除 getpost()、getget() 等將超全域變數註冊為全域變數的危險做法
  • 加入 CSRF Token 驗證表單來源
  • 實作 登入失敗鎖定 機制(計數器 + 時間窗)
  • 使用 HTTPOnly + Secure Cookie 設定 Session
  • 密碼欄位加入 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 = "帳號或密碼錯誤";
}
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved