
通过结合 mysql 的日期函数与 ajax 异步请求,可在 php 投票系统中精确控制每个 id 每日最多被点赞 10 次,次日自动重置计数。
通过结合 mysql 的日期函数与 ajax 异步请求,可在 php 投票系统中精确控制每个 id 每日最多被点赞 10 次,次日自动重置计数。
在构建基于 PHP + MySQL 的投票类应用时,仅统计总点赞数远远不够——真实场景常需业务级频控,例如“每个作品(ID)每天最多获得 10 次点赞”。该限制不能依赖前端(易被绕过),必须由后端 SQL 逻辑+服务端校验共同保障。
✅ 核心实现思路
- 数据库层面:确保 votes 表(或主表)中包含记录创建时间字段(如 created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP);
- 服务端校验:在处理 Ajax 请求的 PHP 接口(如 vote_handler.php 或你项目中的 /10jaar/views/submissions.php)中,先执行一条带日期过滤的 COUNT 查询;
- 原子性操作:仅当当日计数
? 示例代码(PHP + MySQLi)
// vote_handler.php(示例入口)
$id = (int)$_POST['id'] ?? 0;
if (!$id) {
die(json_encode(['success' => false, 'msg' => 'Invalid ID']));
}
$mysqli = new mysqli("localhost", "user", "pass", "voting_db");
$mysqli->set_charset("utf8mb4");
// ✅ 查询该 ID 今日已获点赞数
$stmt = $mysqli->prepare("
SELECT COUNT(*) FROM votes
WHERE target_id = ? AND DATE(created_at) = CURDATE()
");
$stmt->bind_param("i", $id);
$stmt->execute();
$stmt->bind_result($todayCount);
$stmt->fetch();
if ($todayCount >= 10) {
echo json_encode(['success' => false, 'msg' => '今日点赞已达上限(10次)']);
} else {
// ✅ 安全执行点赞(推荐使用 INSERT 记录明细,再汇总;或直接 UPDATE)
$update = $mysqli->prepare("UPDATE submissions SET likes = likes + 1 WHERE id = ?");
$update->bind_param("i", $id);
if ($update->execute()) {
echo json_encode(['success' => true, 'new_likes' => $todayCount + 1]);
} else {
echo json_encode(['success' => false, 'msg' => '更新失败']);
}
}
⚠️ 关键注意事项
- 不要依赖 CURDATE() 在 UPDATE 中直接判断:MySQL 不允许在单条 UPDATE ... WHERE 中同时用 CURDATE() 做条件又修改同一行(可能触发非确定性行为),务必拆分为「查 + 判 + 更」三步;
- 时间基准统一:确保服务器时区(PHP date_default_timezone_set())与 MySQL time_zone 一致,避免跨日异常;
- 防重复提交:前端按钮点击后应立即禁用,并在响应成功后恢复,防止用户快速连点触发多次请求;
- 扩展建议:长期运行建议将点赞记录单独建表(votes(id, target_id, user_ip, created_at)),便于审计、去重(如限制同一 IP 每日最多投 3 票)及后续分析。
通过上述结构化校验,你不仅能精准实现「每 ID 每日 10 票」的硬性规则,还为未来增加用户维度、IP 维度、设备指纹等复合限流策略打下坚实基础。











