php注册逻辑必须先查邮箱唯一性再插入,用预处理语句防注入;密码须用password_hash()加密存varchar(255),禁用明文、md5、sha1;表单提交后重定向防重复,输入需trim及严格校验。

PHP注册逻辑必须校验邮箱唯一性
不检查邮箱是否已存在,会导致重复注册和后续登录混乱。数据库层面加 UNIQUE 约束只是兜底,PHP 层必须先查再插。
- 用
SELECT COUNT(*)或SELECT id查询邮箱是否已存在,不要依赖插入失败后捕获异常来判断 - 查询语句需使用预处理(
$pdo->prepare()),防止 SQL 注入;参数用bindValue()绑定,别拼字符串 - 注意 MySQL 的大小写敏感性:若字段是
utf8mb4_unicode_ci,user@EXAMPLE.COM和user@example.com会被视为相同,前端应统一转小写再传给 PHP
密码不能明文存数据库,必须用 password_hash()
直接存 $_POST['password'] 是严重安全漏洞。PHP 自带的 password_hash() 默认用 bcrypt,足够应对常规场景。
- 注册时调用
password_hash($password, PASSWORD_DEFAULT),得到的哈希值直接存入VARCHAR(255)字段 - 不要自己加盐、不要用
md5()或sha1(),它们不可逆但不抗暴力破解 - 存哈希后,原始密码立即丢弃,别在日志或 session 里保留明文副本
表单提交后必须重定向,避免重复提交
用户刷新注册成功页,会再次 POST,可能创建重复账号或触发重复邮件发送。
- 注册逻辑执行完(插入成功 + 邮件发出),立刻用
header('Location: /success.php')跳转 - 跳转前确保没有输出(包括空格、BOM、
echo),否则报 “headers already sent” 错误 - 如果需要提示信息(如“注册成功”),用
$_SESSION['msg'] = '...'存,跳转后读取并清空
前端传来的数据不能直接信任
哪怕加了 HTML5 type="email" 和 JS 校验,PHP 后端仍要重新验证格式、长度、非法字符。
- 用
filter_var($email, FILTER_VALIDATE_EMAIL)判断邮箱格式,但别只靠它——它不检查长度或 DNS - 用户名限制为字母、数字、下划线,用
preg_match('/^[a-zA-Z0-9_]{3,20}$/', $username) - 对所有输入调用
trim()去首尾空格,防止用户输 " admin " 却被当成新用户名
password_hash() 生成的哈希长度可能随 PHP 版本变化,字段必须留足 255 字符;另外,别把数据库连接配置硬编码在注册脚本里,抽到独立文件并设好权限(如 chmod 600)。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











