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

如何实现点击歌曲请求链接后将其隐藏2小时?

嘿,这个需求挺实用的,用PHP配合数据库就能完美解决,我给你拆解下具体怎么实现:

整体思路

核心逻辑很简单:给每首歌记录最后一次被请求的时间,用户打开页面时,检查这个时间是否在过去2小时内——如果是,就隐藏请求链接;用户点击链接后,立刻更新这首歌的最后请求时间。

1. 先搞个数据库表存请求记录

你需要一张表来追踪每首歌的请求状态,比如叫song_requests,字段不用多,够用就行:

  • song_id:歌曲的唯一ID(得和你现有歌曲列表里的ID对应上)
  • song_name:歌曲名(方便你后台管理,可选)
  • last_requested:最后一次被请求的时间(datetime类型)

给你个创建表的SQL示例,直接跑就能用:

CREATE TABLE song_requests (
    song_id INT PRIMARY KEY,
    song_name VARCHAR(255) NOT NULL,
    last_requested DATETIME DEFAULT NULL
);

记得把你现有的所有歌曲先导入这张表,last_requested可以先设成NULL或者一个很早的时间(比如2000-01-01 00:00:00)。

2. PHP后端分两步走

咱们的后端要干两件事:一是加载页面时判断哪些歌曲能显示链接,二是处理用户的请求点击并更新时间。

2.1 加载歌曲列表时做判断

假设你的歌曲存在一张songs表(或者你用数组存也可以,逻辑差不多),这里用数据库关联查询的例子:

<?php
// 先连数据库,替换成你自己的配置
$conn = mysqli_connect("localhost", "你的用户名", "你的密码", "数据库名");
// 时区一定要对!不然时间判断会乱,比如国内就设上海
date_default_timezone_set('Asia/Shanghai');

// 算出2小时前的时间,用来做判断基准
$two_hours_ago = date("Y-m-d H:i:s", strtotime("-2 hours"));

// 查所有歌曲,同时带上它们的最后请求时间
$sql = "SELECT s.song_id, s.song_name, sr.last_requested 
        FROM songs s
        LEFT JOIN song_requests sr ON s.song_id = sr.song_id";
$result = mysqli_query($conn, $sql);

$song_list = [];
while ($row = mysqli_fetch_assoc($result)) {
    // 判断能不能显示链接:要么从没被请求过,要么上次请求已经超过2小时了
    $can_show_link = is_null($row['last_requested']) || $row['last_requested'] < $two_hours_ago;
    $song_list[] = [
        'id' => $row['song_id'],
        'name' => $row['song_name'],
        'show_link' => $can_show_link
    ];
}
mysqli_close($conn);
?>

2.2 处理用户的请求点击

创建一个request_song.php文件,专门处理用户点击链接的操作:

<?php
if (isset($_GET['song_id'])) {
    // 先把用户传的song_id转成整数,防止SQL注入
    $song_id = intval($_GET['song_id']);
    $conn = mysqli_connect("localhost", "你的用户名", "你的密码", "数据库名");
    date_default_timezone_set('Asia/Shanghai');
    
    // 更新这首歌的最后请求时间为当前时间
    $current_time = date("Y-m-d H:i:s");
    // 用INSERT...ON DUPLICATE KEY UPDATE,不管有没有记录都能更新
    $sql = "INSERT INTO song_requests (song_id, last_requested)
            VALUES ($song_id, '$current_time')
            ON DUPLICATE KEY UPDATE last_requested = '$current_time'";
    mysqli_query($conn, $sql);
    
    // 这里加你发送请求到手机的逻辑,比如调用推送API、发短信啥的
    
    mysqli_close($conn);
    // 跳回歌曲列表页面
    header("Location: song_list.php");
    exit;
}
?>
3. 前端页面渲染

在你的歌曲列表页面(比如song_list.php),用PHP循环把歌曲渲染出来,根据show_link的值决定显示链接还是提示:

<!DOCTYPE html>
<html>
<head>
    <title>歌曲请求列表</title>
</head>
<body>
    <h1>选一首歌请求到我的手机吧 🎵</h1>
    <?php foreach ($song_list as $song): ?>
        <div style="margin: 10px 0;">
            <strong><?php echo htmlspecialchars($song['name']); ?></strong>
            <?php if ($song['show_link']): ?>
                <a href="request_song.php?song_id=<?php echo $song['id']; ?>" style="margin-left: 15px;">点击请求</a>
            <?php else: ?>
                <span style="color: #999; margin-left: 15px;">这首歌2小时内已被请求过,稍后再试哦</span>
            <?php endif; ?>
        </div>
    <?php endforeach; ?>
</body>
</html>
几个要注意的小细节
  • 防重复提交:可以给前端链接加个点击后禁用的逻辑,比如用JavaScript,防止用户疯狂点击同一链接;后端也可以用session记录用户最近的请求,避免重复处理。
  • 安全问题:一定要对用户输入的song_id做校验(比如上面用了intval),防止SQL注入;输出歌曲名时用htmlspecialchars,避免XSS攻击。
  • 替代方案:如果不想用数据库,也可以用JSON文件存请求记录,但数据库在多用户场景下更稳定,不容易出问题。

这样一套下来,就能实现你要的功能:每首歌被请求后,接下来2小时内链接会自动隐藏,时间到了才会重新显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:08:01