如何实现MySQL中员工ID每日仅可录入一次并插入指定表?
解决方案:员工ID24小时内仅可录入一次并同步插入表
核心逻辑说明
要实现员工ID每24小时仅能录入一次,需完成两步关键校验:
- 先验证员工ID是否存在于
emp_list表,确保是合法员工 - 再检查该员工ID在
ticket_logs中的最近录入记录是否距离当前时间不足24小时
同时,插入ticket_logs时需自动记录当前时间到datelogs字段,为后续时间校验提供依据。
修正后的PHP代码(含MySQL查询)
// 用预处理语句防止SQL注入,先校验员工ID是否合法 $stmt = $con->prepare("SELECT emp_id FROM emp_list WHERE emp_id = ?"); $stmt->bind_param("s", $emp_id); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows === 0) { echo '<span style="color:#fa0a0a;text-align:center;">Invalid ID Number!</span>'; $stmt->close(); mysqli_close($con); exit; } $stmt->close(); // 校验该员工最近24小时内是否已录入过 $stmt = $con->prepare("SELECT datelogs FROM ticket_logs WHERE emp_id = ? AND datelogs >= DATE_SUB(NOW(), INTERVAL 24 HOUR) LIMIT 1"); $stmt->bind_param("s", $emp_id); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows > 0) { echo '<span style="color:#fa0a0a;text-align:center;">You can only submit once every 24 hours! Please try again later.</span>'; $stmt->close(); mysqli_close($con); exit; } $stmt->close(); // 插入记录到ticket_logs,自动填充当前时间到datelogs $stmt = $con->prepare("INSERT INTO ticket_logs (emp_id, datelogs) VALUES (?, NOW())"); $stmt->bind_param("s", $emp_id); if ($stmt->execute()) { echo '<span style="color:#0d02db;text-align:center;">ID Number Accepted! Please return after 24 hours, Thank you!</span>'; } else { echo '<span style="color:#fa0a0a;text-align:center;">Failed to record your submission, please try again.</span>'; } $stmt->close(); mysqli_close($con);
关键优化点
- SQL注入防护:使用mysqli预处理语句替代直接拼接SQL字符串,彻底避免注入风险
- 精准时间校验:通过
DATE_SUB(NOW(), INTERVAL 24 HOUR)判断滚动24小时内的重复记录 - 字段完整性:插入时自动填充
datelogs字段,确保后续校验有可靠的时间依据 - 逻辑分层:拆分合法性校验、时间限制校验、插入操作三个步骤,错误提示更明确
额外数据库层面约束建议
如果需求是自然日内仅可录入一次而非滚动24小时,可给ticket_logs添加联合唯一索引,从数据库层面强制限制:
ALTER TABLE ticket_logs ADD UNIQUE INDEX idx_emp_date (emp_id, DATE(datelogs));
内容的提问来源于stack exchange,提问作者Shy Flesh
相关产品推荐
相关产品推荐

