如何使用mysql实现验证码校验_mysql验证码存储设计

发布时间 - 2025-12-27 00:00:00    点击率:
验证码表需包含phone_or_email、code、expires_at、used、created_at字段,设phone_or_email为唯一键,建(phone_or_email,used)联合索引和expires_at单索引;插入用ON DUPLICATE KEY覆盖旧码;校验用原子UPDATE语句;定时清理过期记录。

验证码存储表设计

验证码通常需要短期有效、单次使用、绑定用户行为(如手机号或邮箱),所以数据库表要包含关键字段:唯一标识(如手机号)、验证码值、过期时间、是否已使用、创建时间。推荐用以下结构:

  • phone_or_email:VARCHAR(50),作为查询主键,支持手机号或邮箱
  • code:CHAR(6) 或 VARCHAR(10),存纯数字验证码(如“123456”)
  • expires_at:DATETIME,设为当前时间 + 5 分钟(例如 NOW() + INTERVAL 5 MINUTE
  • used:TINYINT(1),默认 0(未使用),校验成功后更新为 1
  • created_at:DATETIME DEFAULT CURRENT_TIMESTAMP

建议给 (phone_or_email, used) 加联合索引,方便快速查未使用的最新码;同时对 expires_at 单独建索引,便于定时清理过期记录。

插入验证码(发送时)

用户点击“获取验证码”后,生成随机 6 位数字(PHP 可用 random_int(100000, 999999)),然后执行插入语句,覆盖旧的未使用记录:

INSERT INTO verify_codes (phone_or_email, code, expires_at, used) 
VALUES ('138****1234', '654321', NOW() + INTERVAL 5 MINUTE, 0)
ON DUPLICATE KEY UPDATE 
  code = VALUES(code), 
  expires_at = VALUES(expires_at), 
  used = 0;

前提是 phone_or_email 设为唯一键(UNIQUE KEY)。这样能防止重复发码堆积,也避免用户频繁刷码。

校验验证码(登录/注册时)

用户提交验证码后,需原子性地检查三项:是否存在、是否过期、是否未使用。推荐一条 SQL 完成验证并标记为已用:

UPDATE verify_codes 
SET used = 1 
WHERE phone_or_email = '138****1234' 
  AND code = '654321' 
  AND expires_at > NOW() 
  AND used = 0;

执行后检查 ROW_COUNT() 是否为 1。是 → 校验通过;否 → 提示“验证码错误、已过期或已被使用”。不建议先 SELECT 再 UPDATE,避免并发时被重复使用。

自动清理过期数据

长期运行中,过期但未使用的记录会累积。可每天用事件(EVENT)清理:

CREATE EVENT clean_expired_codes
ON SCHEDULE EVERY 1 DAY
DO DELETE FROM verify_codes WHERE expires_at < NOW() AND used = 0;

也可在应用层定时任务中执行相同 SQL。注意:不要删 used = 1 的记录,便于审计或排查问题(保留 7 天即可)。


# mysql  # php  # ai  # 邮箱  # red  # sql  # select  # char  #   # Event  # 并发  # 事件  # default  # 数据库  # 验证码  # 设为  # 一键  # 已被  # 可在  # 三项  # 绑定  # 是否存在  # 速查  # 但未 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: javascript日期怎么处理_如何格式化输出  公司门户网站制作流程,华为官网怎么做?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  西安专业网站制作公司有哪些,陕西省建行官方网站?  网站制作报价单模板图片,小松挖机官方网站报价?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何构建满足综合性能需求的优质建站方案?  如何用腾讯建站主机快速创建免费网站?  javascript中对象的定义、使用以及对象和原型链操作小结  EditPlus中的正则表达式实战(5)  如何在云指建站中生成FTP站点?  海南网站制作公司有哪些,海口网是哪家的?  Laravel storage目录权限问题_Laravel文件写入权限设置  如何用已有域名快速搭建网站?  Laravel如何实现数据库事务?(DB Facade示例)  Internet Explorer官网直接进入 IE浏览器在线体验版网址  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何为不同团队 ID 动态生成多个非值班状态按钮  WEB开发之注册页面验证码倒计时代码的实现  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel怎么调用外部API_Laravel Http Client客户端使用  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何快速搭建高效WAP手机网站?  Bootstrap CSS布局之列表  JavaScript如何实现倒计时_时间函数如何精确控制  Laravel中的Facade(门面)到底是什么原理  iOS UIView常见属性方法小结  Laravel用户密码怎么加密_Laravel Hash门面使用教程  在centOS 7安装mysql 5.7的详细教程  在线教育网站制作平台,山西立德教育官网?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  ,南京靠谱的征婚网站?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Thinkphp 中 distinct 的用法解析  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Laravel如何创建自定义中间件?(Middleware代码示例)  如何在宝塔面板中创建新站点?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  如何在腾讯云服务器快速搭建个人网站?  原生JS获取元素集合的子元素宽度实例  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Swift中swift中的switch 语句  网站制作壁纸教程视频,电脑壁纸网站?  php json中文编码为null的解决办法  浅谈javascript alert和confirm的美化