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

PHP实现双Banner轮换显示失效问题求助

问题排查与修复方案

核心问题分析

你的轮换思路逻辑可行,但存在两个关键问题导致失效:

  • Cookie过期时间计算错误:strtotime(date('Y-m-d 23:59')) + 186400的写法在当日时间超过23:59时,会生成过去的时间戳,导致Cookie被直接标记为过期,无法正常存储状态。
  • 首次访问的Cookie标记与显示逻辑对应混乱:初始设置Cookie为two但显示cta1,虽不影响首次显示,但会让后续状态判断的对应关系变得模糊,增加排查难度。

修复后的完整代码

PHP代码

<?php
// 直接设置Cookie24小时后过期,避免日期计算的歧义
$expire = time() + 86400;

// 初始化默认显示状态
$showCta1 = true;

if(isset($_COOKIE['cta'])){
    if($_COOKIE['cta'] === 'two') {
        // 上一次显示cta2,本次切换为cta1
        $showCta1 = true;
        setcookie('cta', 'one', $expire, '/');
    } else {
        // 上一次显示cta1,本次切换为cta2
        $showCta1 = false;
        setcookie('cta', 'two', $expire, '/');
    }
} else {
    // 首次访问默认显示cta1,标记Cookie为one(用于下一次切换)
    $showCta1 = true;
    setcookie('cta', 'one', $expire, '/');
}

// 统一输出样式,避免重复echo标签
echo $showCta1 
    ? '<style>.cta1{display:block !important;}.cta2{display:none !important;}</style>'
    : '<style>.cta1{display:none !important;}.cta2{display:block !important;}</style>';
?>

HTML代码

<div class="cta1">banner 1</div>
<div class="cta2">banner 2</div>

额外优化建议

  • 给两个Banner添加默认隐藏的CSS,避免PHP样式加载前两个Banner同时显示:
    .cta1, .cta2 {
        display: none;
    }
    
  • 如果网站存在子域名,可在setcookie中添加域名参数,确保Cookie全站生效:
    setcookie('cta', 'one', $expire, '/', 'yourdomain.com', isset($_SERVER['HTTPS']), true);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:33:22