如何实现点击歌曲请求链接后将其隐藏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
相关产品推荐
相关产品推荐

