PHP教程如何实现用户登录注册功能开发教程

admin PHP教程 4


做网站开发的朋友,是不是觉得用户登录注册功能看起来简单,实际写起来却问题一堆?要么注册时密码明文存数据库,要么登录后一刷新就掉线,要么验证码根本起不到防机器人的作用。其实啊,登录注册是网站的 “大门”,既要好用又要安全,今天兔子哥就手把手教你用 PHP 实现靠谱的登录注册功能,从数据库设计到安全防护全涵盖,新手也能跟着做!

一、先搭基础:用户表该怎么设计?


想做登录注册,得先有个地方存用户信息,数据库表设计是第一步。很多新手表设计得太简单,后面加功能都麻烦。用户表至少得有这些字段:
字段名类型作用说明
idint用户唯一 ID(自增主键)
usernamevarchar用户名(登录用,唯一)
emailvarchar邮箱(找回密码用,唯一)
passwordvarchar加密后的密码(别存明文)
avatarvarchar头像路径(可选)
statustinyint状态(0 禁用 / 1 正常)
create_timedatetime注册时间
last_login_timedatetime最后登录时间

可能有朋友问:“为啥用户名和邮箱要设唯一?” 因为不能让两个用户用同一个用户名或邮箱注册啊,不然登录时就分不清谁是谁了。用 SQL 建表时记得加唯一索引:
sql
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL UNIQUE,password VARCHAR(255) NOT NULL,avatar VARCHAR(255),status TINYINT DEFAULT 1,create_time DATETIME DEFAULT CURRENT_TIMESTAMP,last_login_time DATETIME);

二、注册功能:既要方便又要安全


注册功能看似简单,其实有很多细节要注意,比如密码加密、表单验证,不然很容易出安全问题。

1. 表单设计:让用户填得明白


注册表单至少要有用户名、邮箱、密码、确认密码这几个字段,记得加简单的前端验证,比如密码长度不够时提示:
html
<form method="post" action="register.php"><input type="text" name="username" placeholder="用户名" required><input type="email" name="email" placeholder="邮箱" required><input type="password" name="password" placeholder="密码(至少6位)" required><input type="password" name="confirm_password" placeholder="确认密码" required><button type="submit">注册button>form>

前端验证只是方便用户,真正的验证还得在后端做,别信前端传过来的数据!

2. 后端验证:把好数据入口关


用户提交数据后,后端要做一系列检查,防止垃圾数据和恶意提交:
php
// register.phpif ($_SERVER['REQUEST_METHOD'] === 'POST') {$username = trim($_POST['username']);$email = trim($_POST['email']);$password = $_POST['password'];$confirmPassword = $_POST['confirm_password'];$errors = [];// 验证用户名if (strlen($username) < 3) {$errors[] = "用户名至少3个字符!";}// 验证邮箱格式if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {$errors[] = "邮箱格式不正确!";}// 验证密码if (strlen($password) < 6) {$errors[] = "密码至少6位!";} elseif ($password !== $confirmPassword) {$errors[] = "两次密码不一致!";}// 检查用户名和邮箱是否已存在$userExists = Db::name('users')->where('username', $username)->find();if ($userExists) {$errors[] = "用户名已被注册!";}$emailExists = Db::name('users')->where('email', $email)->find();if ($emailExists) {$errors[] = "邮箱已被注册!";}// 没错误就注册if (empty($errors)) {// 密码加密(重点!千万别存明文)$hashedPassword = password_hash($password, PASSWORD_DEFAULT);// 存入数据库Db::name('users')->insert(['username' => $username,'email' => $email,'password' => $hashedPassword]);echo "注册成功,现在可以登录了!";} else {// 显示错误信息foreach ($errors as $error) {echo $error . "
"
;}}}

这里的password_hash函数特别重要,能把密码加密后再存,就算数据库被攻破,别人也拿不到真实密码。千万别直接存明文密码,之前有个网站就是这么干的,用户密码全泄露了,损失惨重!


三、登录功能:验证身份还要保持登录状态


登录功能的核心是验证用户名密码,还要让用户登录后保持状态,不用每次都输密码。

1. 验证登录信息:确保身份正确


用户提交登录表单后,后端要查数据库验证:
php
// login.phpif ($_SERVER['REQUEST_METHOD'] === 'POST') {$username = $_POST['username'];$password = $_POST['password'];// 查用户$user = Db::name('users')->where('username', $username)->find();if (!$user) {echo "用户名不存在!";exit;}// 验证密码(用password_verify解密验证)if (!password_verify($password, $user['password'])) {echo "密码错误!";exit;}// 检查用户状态if ($user['status'] != 1) {echo "账号已禁用!";exit;}// 登录成功,更新最后登录时间Db::name('users')->where('id', $user['id'])->update(['last_login_time' => date('Y-m-d H:i:s')]);// 保持登录状态(用SESSION)session_start();$_SESSION['user_id'] = $user['id'];$_SESSION['username'] = $user['username'];echo "登录成功,正在跳转到首页...";header('Location: index.php');}

这里用password_verify验证加密后的密码,和password_hash是一对,别自己写加密算法,容易有漏洞。

2. 用 SESSION 保持登录状态


登录成功后,怎么让网站知道 “你是谁”?这就要用到 SESSION 了,简单说就是给用户发个 “身份证”,每次访问都带上:
php
// index.php 首页判断是否登录session_start();if (!isset($_SESSION['user_id'])) {// 没登录就跳转到登录页header('Location: login.php');exit;}// 已登录,显示用户信息echo "欢迎回来," . $_SESSION['username'];

SESSION 会在服务器存用户信息,客户端用 Cookie 存 SESSION ID,只要不退出登录,下次访问还能识别身份。记得在 php.ini 里设置session.cookie_httponly = On,防止 Cookie 被 JS 读取,更安全。


四、常见问题:这些坑别再踩了


1. 密码加密别用 MD5,早就不安全了


很多老教程还在用 MD5 加密密码,其实 MD5 很容易被破解,现在必须用password_hash,它会自动生成随机盐值,更安全。

2. 别忘了关闭 SESSION 和退出登录功能


用户不想登录了怎么办?得做个退出功能,销毁 SESSION:
php
// logout.phpsession_start();// 销毁SESSIONsession_unset();session_destroy();echo "已退出登录,正在跳转到登录页...";header('Location: login.php');

3. 防止频繁注册登录,加个验证码


为了防止机器人恶意注册,可以加个验证码,用 PHP 的 GD 库生成就行,虽然简单但能挡住大部分机器人。

五、兔子哥的实战心得


登录注册功能虽然基础,但做好不容易。我的建议是:
  1. 安全永远是第一位的,密码必须加密,表单必须验证,别图省事省步骤
  2. 多考虑用户体验,比如注册时提示 “用户名已存在” 而不是模糊的 “注册失败”
  3. 新手可以先用原生 PHP 写一遍,理解原理后再用框架,框架里的登录注册功能也是这么个逻辑,只是封装得更好了

其实刚开始做登录注册时,我也犯过存明文密码、忘记验证邮箱格式的错误,多写几次、多测试几种情况就熟练了。这两个功能是网站的基础,做好了后面加其他功能才踏实。
希望这篇教程能帮你搞定登录注册功能,动手试试吧,做完后你会对 PHP 交互功能有更深的理解!

标签: 数据库 验证码

上一篇当前分类已是最后一篇

下一篇php在线教程实战指南:电商网站开发案例+在线编码练习

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~