You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHP Cookie设置访客提交按钮点击次数限制?

嘿,这个需求用PHP Cookie就能完美实现,我给你梳理清楚步骤,再附上可直接用的代码,你照着改就行:

核心实现思路
  • 用Cookie存储两个关键信息:用户累计发送邮件的次数,以及最后一次发送的时间戳
  • 每次用户访问页面时,先读取这两个Cookie值
  • 根据读取到的信息,判断三种场景:
    • 累计发送次数达到3次:显示「Your limit is over」
    • 距离上次发送时间过短(比如1分钟内):显示「you already sent a mail to us」
    • 符合发送条件:显示邮件表单,允许用户提交
完整可运行代码示例
<?php
// 自定义配置参数,可按需调整
$max_send_limit = 3;          // 最大允许发送次数
$cooldown_seconds = 60;       // 重复提交冷却时间(秒,比如1分钟)
$cookie_expire_days = 30;     // Cookie有效期(天)

// 初始化Cookie变量
$send_count = isset($_COOKIE['email_send_count']) ? (int)$_COOKIE['email_send_count'] : 0;
$last_send_timestamp = isset($_COOKIE['last_send_time']) ? (int)$_COOKIE['last_send_time'] : 0;
$feedback_message = '';

// 处理表单提交逻辑
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 先判断是否达到次数上限
    if ($send_count >= $max_send_limit) {
        $feedback_message = "*Your limit is over*";
    } else {
        $current_time = time();
        // 判断是否在冷却期内重复提交
        if ($current_time - $last_send_timestamp < $cooldown_seconds) {
            $feedback_message = "*you already sent a mail to us*";
        } else {
            // 这里替换成你的实际邮件发送逻辑
            // 示例:使用PHP内置mail()函数发送邮件
            $recipient_email = 'your-target-email@example.com';
            $email_subject = $_POST['subject'];
            $email_body = "发件人邮箱:{$_POST['email']}\n\n内容:{$_POST['message']}";
            $email_headers = "From: {$_POST['email']}\r\nReply-To: {$_POST['email']}";
            
            // 尝试发送邮件
            if (mail($recipient_email, $email_subject, $email_body, $email_headers)) {
                // 发送成功,更新Cookie
                $send_count++;
                setcookie('email_send_count', $send_count, time() + $cookie_expire_days*24*60*60, '/');
                setcookie('last_send_time', $current_time, time() + $cookie_expire_days*24*60*60, '/');
                $feedback_message = "邮件发送成功!感谢你的联系~";
            } else {
                $feedback_message = "抱歉,邮件发送失败,请稍后重试。";
            }
        }
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>联系我们</title>
</head>
<body>
    <?php if (!empty($feedback_message)): ?>
        <p><?php echo $feedback_message; ?></p>
    <?php endif; ?>

    <?php if ($send_count < $max_send_limit): ?>
        <form method="POST" action="">
            <div>
                <label for="email">你的邮箱:</label>
                <input type="email" id="email" name="email" required>
            </div>
            <div>
                <label for="subject">邮件主题:</label>
                <input type="text" id="subject" name="subject" required>
            </div>
            <div>
                <label for="message">邮件内容:</label>
                <textarea id="message" name="message" rows="5" required></textarea>
            </div>
            <button type="submit">发送邮件</button>
        </form>
    <?php endif; ?>
</body>
</html>
关键细节解释
  • Cookie读写逻辑:用isset()判断Cookie是否存在,不存在则初始化默认值,避免出现未定义变量错误
  • 次数上限控制:当累计发送次数达到设定的$max_send_limit时,不再显示表单,直接提示上限信息
  • 重复提交防护:通过时间戳对比,确保用户在冷却时间内无法重复发送,避免恶意刷邮件
  • Cookie有效期:设置了30天有效期,用户即使关闭浏览器,再次访问时发送次数也会保留;如果需要会话结束就重置,可以把有效期设为0
  • 邮件发送部分:示例用了PHP内置的mail()函数,如果你服务器配置不支持,可以替换成PHPMailer等第三方邮件库,兼容性更好
额外提示

Cookie是存储在用户浏览器端的,所以用户可以手动清除Cookie来重置发送次数。如果需要更严格的限制,建议结合服务器端数据库(比如记录用户IP地址),但对于普通的防刷需求,Cookie已经足够实用。

内容的提问来源于stack exchange,提问作者Russell Rex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:13:06