发布于2026-07-05 阅读(0)
扫一扫,手机访问
本文介绍如何通过数据库日期差值校验,限制用户每月仅能修改一次姓名,核心是使用 MySQL 的 DATEDIFF() 函数计算当前日期与上次修改日期的天数差,并结合 PHP 实现安全、可靠的业务逻辑控制。
用户中心类的应用里,像姓名修改这种敏感操作,往往需要加个频率限制——最常见的需求就是“每月仅可修改一次”。直接拿 MONTH() 函数比对年月?跨年、跨月边界问题分分钟翻车(比如1月31日改完,2月28日到底能不能改?按月份算已经过了一个月,但实际才28天)。那用“30天”作为阈值呢?虽然严格来说和自然月有偏差,但业务上更稳健,也更容易理解和测试。说白了,这是用轻微精度损失换来了绝对的可靠性。
if (isset($_POST['change-name']) && !empty(trim($_POST['name']))) {
$name = trim($_POST['name']);
// 长度校验
if (strlen($name) > 20) {
$errors = "姓名不得超过20个字符";
$count_error = '1';
} else {
// ✅ 关键:一次性查询 + 判断 —— 使用 DATEDIFF(NOW(), name_changed) 获取天数差
$stmt = $con->prepare("
SELECT
id,
name_changed,
DATEDIFF(NOW(), name_changed) AS days_since_last_change
FROM user
WHERE email = ?"
);
$stmt->bind_param("s", $_SESSION['email']);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 0) {
$errors = "用户信息异常,请重新登录";
$count_error = '1';
} else {
$row = $result->fetch_assoc();
// ✅ 逻辑清晰:若未修改过('0000-00-00')或距上次修改已满30天,则允许更新
$canChange = ($row['name_changed'] === '0000-00-00')
|| ($row['days_since_last_change'] >= 30);
if ($canChange) {
// 更新姓名
$updateName = $con->prepare("UPDATE user SET name = ? WHERE email = ?");
$updateName->bind_param("ss", $name, $_SESSION['email']);
if ($updateName->execute()) {
// 同步更新 name_changed 时间戳(使用 NOW() 确保数据库时区一致)
$updateDate = $con->prepare("UPDATE user SET name_changed = NOW() WHERE email = ?");
$updateDate->bind_param("s", $_SESSION['email']);
$updateDate->execute();
// 成功提示可在此添加
} else {
$errors = "姓名更新失败,请稍后重试";
$count_error = '1';
}
} else {
$errors = "您本月已修改过姓名,需等待30天后方可再次修改";
$count_error = '1';
}
}
}
}
几个必须注意的细节:
prepare/bind_param),原始代码中直接拼接 $_SESSION['email'] 是极其危险的做法——SQL 注入漏洞就这么来的。name_changed 字段建议定义为 DATE 或 DATETIME 类型(别用 VARCHAR),默认值设 NULL 比 '0000-00-00' 更规范。后者在 MySQL 严格模式下会直接报错。初始化时给 NULL,PHP 里用 is_null($row['name_changed']) 判断更清晰。NOW() 返回的是数据库服务器本地时间。确保 PHP 和 MySQL 的时区一致(推荐统一设为 UTC 或系统时区),否则时间偏差会让你调试到怀疑人生。DateTime 做精细计算——$dateDb->modify('+1 month')。但从实际运维角度看,“30天冷静期”的方案更容易测试、更容易向产品解释、也更好维护。说到底,利用 DATEDIFF() 在数据库层完成时间判断,再配合预处理语句和清晰的分支逻辑,就能安全、简洁地把姓名修改频次控制得妥妥帖帖。既避开了 PHP 端复杂的时间运算,又让 SQL 承担了它最擅长的数据校验工作,何乐而不为呢?
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8