Laravel 9+ 启用新验证令牌机制后,password_resets 表可能未创建,需确认是否存在;若存在,应执行 SQL 删除过期记录,并确保时区、缓存配置与 Laravel 一致。

为什么 phpMyAdmin 里找不到 password_resets 表
因为 Laravel 默认使用 password_resets 表,但如果你用的是 Laravel 9+ 且启用了新的「验证令牌」机制(比如通过 Illuminate\Auth\Passwords\TokenRepository 配合缓存驱动),这张表可能根本没被创建——它只在你明确运行过 php artisan migrate 且未禁用该迁移时才存在。先确认表是否存在:在 phpMyAdmin 左侧数据库列表里展开你的 Laravel 数据库,看有没有名为 password_resets 的表。没有?那 Token 很可能存于缓存(Redis / Memcached)或数据库的 cache 表中,phpMyAdmin 直接清理不了。
查到表后怎么安全删过期 Token
password_resets 表结构通常含 email、token、created_at 字段,Laravel 默认不设自动过期索引,全靠应用层判断。phpMyAdmin 里不能依赖 UI 筛选“过期”,得手动写 SQL:
DELETE FROM `password_resets` WHERE `created_at` < DATE_SUB(NOW(), INTERVAL 60 MINUTE);
这个语句删掉 60 分钟前生成的记录——和 Laravel 默认的 expire 配置(60 分钟)对齐。注意:
-
INTERVAL 60 MINUTE不能写成60 minutes,MySQL 会报错 - 如果表用的是
timestamp类型(带时区),确保服务器时区和 Laravel 的config/app.php中'timezone'一致,否则时间判断偏移 - 别用 phpMyAdmin 的“勾选多行→删除”方式清空,容易误删未过期的 token
删完还要检查 .env 和 config/auth.php 是否匹配
删了数据库记录不代表 Token 立即失效——Laravel 在验证时还会比对缓存(如果启用了 cache 驱动)。检查两个地方:
立即学习“PHP免费学习笔记(深入)”;
-
.env里的BROADCAST_DRIVER不影响,但CACHE_DRIVER如果是redis或memcached,token 可能还活在缓存里 -
config/auth.php中'passwords' => ['users' => [... 'expire' => 60]]必须和你 SQL 删除的时间窗口一致,否则应用仍会尝试验证已删的 token 并抛出TokenMismatchException - 如果缓存驱动是
database,对应表是cache,不是password_resets;这时得去清cache表里key以password_reset:开头的记录
更稳妥的做法:用 Artisan 命令代替 phpMyAdmin
直接执行 php artisan tinker 然后敲:
DB::table('password_resets')->where('created_at', '<', now()->subMinutes(60))->delete();
好处是:时间计算走 PHP,不受 MySQL 时区/函数支持差异影响;还能套用 Laravel 的数据库连接配置(比如读写分离时只删主库)。如果连 SSH 都没有,非得用 phpMyAdmin,那就必须确认 SQL 时间表达式和 Laravel 实际判断逻辑完全对齐——这点最容易被忽略。



















