无需JS和SQL,用HTML+PHP实现登录登出并存储账号密码到TXT
实现无JS、无SQL的PHP+TXT登录/登出功能
首先修正你的HTML表单:把method="get"改成method="post"(GET会把密码暴露在URL里,极度不安全),同时增加操作选项区分登录和注册:
<form method="post" action="form.php"> <label>用户名</label> <input type="text" id="name" name="name" autocomplete="off" required> <label>密码</label> <input type="password" id="password" name="password" autocomplete="off" required> <div> <input type="radio" name="action" value="login" checked> 登录 <input type="radio" name="action" value="register"> 注册 </div> <input type="submit" value="提交"> </form>
接下来是核心的form.php逻辑,用TXT存储用户数据,绝对不要明文存密码,用PHP自带的加密/验证函数处理:
<?php // 启动会话,维护登录状态 session_start(); // 定义用户数据存储文件路径 $userFile = 'users.txt'; // 处理表单提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = trim($_POST['name']); $password = $_POST['password']; $action = $_POST['action']; // 避免用户名包含分隔符(这里用冒号分割用户名和密码哈希) if (strpos($username, ':') !== false) { echo '用户名不能包含冒号'; exit; } // 读取现有用户数据 $users = []; if (file_exists($userFile)) { $lines = file($userFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach ($lines as $line) { list($user, $hash) = explode(':', $line, 2); $users[$user] = $hash; } } switch ($action) { case 'register': if (isset($users[$username])) { echo '该用户名已存在,请直接登录'; } else { // 加密密码并追加写入文件 $hash = password_hash($password, PASSWORD_DEFAULT); file_put_contents($userFile, "$username:$hash\n", FILE_APPEND); echo '注册成功,请登录'; } break; case 'login': if (isset($users[$username]) && password_verify($password, $users[$username])) { // 记录登录状态 $_SESSION['username'] = $username; echo '登录成功!<a href="logout.php">点击登出</a>'; } else { echo '用户名或密码错误'; } break; } } else { // 非POST请求时,检查登录状态 if (isset($_SESSION['username'])) { echo '当前登录用户:' . $_SESSION['username'] . ' <a href="logout.php">点击登出</a>'; } else { echo '<p>请通过表单登录或注册</p>'; } } ?>
最后是登出功能的logout.php:
<?php session_start(); // 销毁会话清除登录状态 session_destroy(); // 跳转回登录页面 header('Location: form.php'); exit; ?>
关键注意事项
- 这种TXT存储仅适合小型测试场景,生产环境务必使用数据库,同时开启HTTPS传输避免密码被拦截。
- 确保
users.txt有正确的读写权限,且不要放在网站根目录下,防止被直接访问。 password_hash()会自动生成盐值,无需额外存储。
内容的提问来源于stack exchange,提问作者tsx
相关产品推荐
相关产品推荐

