connect_error) { die(json_encode(array( "success" => false, "message" => "数据库连接失败: " . $conn->connect_error ))); } // 设置数据库连接字符集 $conn->set_charset("utf8mb4"); // 获取硬编码音乐数据 function getHardcodedMusic() { $musicPath = __DIR__ . '/data/music.php'; // 检查文件是否存在 if (!file_exists($musicPath)) { return array( "success" => false, "message" => "硬编码音乐文件不存在", "data" => array() ); } // 读取硬编码音乐(使用require_once并捕获返回值) $hardcodedMusic = require_once $musicPath; // 验证数据格式 if (is_array($hardcodedMusic)) { return array( "success" => true, "message" => "成功获取硬编码音乐", "data" => $hardcodedMusic ); } else { return array( "success" => false, "message" => "硬编码音乐格式不正确", "data" => array() ); } } // 从数据库获取音乐 function getDatabaseMusic($conn) { $sql = "SELECT id, title, artist, category, mp3, bvid, duration FROM music"; $result = $conn->query($sql); $musicList = array(); if ($result && $result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $musicList[] = $row; } return array( "success" => true, "message" => "成功获取数据库音乐", "data" => $musicList ); } else { return array( "success" => false, "message" => "数据库中没有找到音乐数据", "data" => array() ); } } // 获取所有音乐(合并数据库和硬编码) function getAllMusic($conn) { // 获取两种来源的音乐 $dbMusic = getDatabaseMusic($conn); $hardcodedMusic = getHardcodedMusic(); // 合并音乐列表(去重处理) $allMusic = array(); $ids = array(); // 添加数据库音乐 foreach ($dbMusic['data'] as $music) { $id = $music['id']; if (!in_array($id, $ids)) { $ids[] = $id; $allMusic[] = $music; } } // 添加硬编码音乐 foreach ($hardcodedMusic['data'] as $music) { $id = $music['id']; if (!in_array($id, $ids)) { $ids[] = $id; $allMusic[] = $music; } } return array( "success" => true, "message" => "共获取 " . count($allMusic) . " 首音乐(数据库: " . count($dbMusic['data']) . ", 硬编码: " . count($hardcodedMusic['data']) . ")", "data" => $allMusic, "sources" => array( "database" => $dbMusic['success'], "hardcoded" => $hardcodedMusic['success'] ) ); } // 获取音乐标签(合并数据库和硬编码) function getMusicTags($conn) { // 获取所有音乐 $allMusic = getAllMusic($conn); $tags = array(); if ($allMusic['success']) { foreach ($allMusic['data'] as $music) { if (!empty($music['category']) && !in_array($music['category'], $tags)) { $tags[] = $music['category']; } } } return array( "success" => !empty($tags), "message" => empty($tags) ? "没有找到音乐标签" : "成功获取 " . count($tags) . " 个标签", "data" => $tags ); } // 获取音乐地址(同时检查数据库和硬编码) /** * 获取音乐地址(同时检查数据库和硬编码)- 修复版 * 增加了对 SQL 语句准备失败的检查,避免触发 500 错误。 */ /** * 获取音乐的分享播放URL * 直接返回格式为 shanwogou.cn/audio/play.php?play=音乐id 的链接 */ function getMusicUrl($conn) { // 1. 验证输入的音乐ID $musicId = $_GET['id'] ?? ''; if (empty($musicId)) { return array( "success" => false, "message" => "音乐 ID 不能为空" ); } // 2. 核心逻辑:检查该ID的音乐是否存在于系统中 // (我们不再返回真实MP3地址,但需要确认音乐ID是有效的) $musicExists = false; // 2.1 先检查数据库 $sql = "SELECT id FROM music WHERE id = ?"; // 只需检查ID是否存在 $stmt = $conn->prepare($sql); if ($stmt) { // 检查prepare是否成功 $stmt->bind_param("s", $musicId); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows > 0) { $musicExists = true; } $stmt->close(); } // 2.2 如果数据库中不存在,再检查硬编码文件 if (!$musicExists) { $hardcodedMusic = getHardcodedMusic(); if ($hardcodedMusic['success']) { foreach ($hardcodedMusic['data'] as $music) { if ((string)$music['id'] === (string)$musicId) { $musicExists = true; break; } } } } // 3. 根据检查结果返回响应 if ($musicExists) { // 如果音乐存在,生成并返回分享URL $shareUrl = "https://shanwogou.cn/audio/play.php?play=" . urlencode($musicId); return array( "success" => true, "data" => $shareUrl, "source" => "share_link" // 标记来源为分享链接 ); } else { // 如果音乐不存在,返回错误信息 return array( "success" => false, "message" => "没有找到该 ID 的音乐" ); } } function getAnnouncements($conn) { // 准备SQL查询,从announcements表中获取所有记录,并按ID倒序排列(最新的在前) $sql = "SELECT id, nr, time FROM announcements ORDER BY id DESC"; // 执行查询 $result = $conn->query($sql); // 初始化一个空数组来存储公告数据 $announcementList = array(); // 检查查询是否成功且有结果 if ($result && $result->num_rows > 0) { // 循环遍历所有结果行 while ($row = $result->fetch_assoc()) { // 将每一行公告数据添加到数组中 $announcementList[] = $row; } // 返回成功响应,包含公告数据 return array( "success" => true, "message" => "成功获取 " . count($announcementList) . " 条公告", "data" => $announcementList ); } else { // 如果查询失败或没有数据,返回失败响应 return array( "success" => false, "message" => "没有找到公告数据或查询失败", "data" => array() ); } } // 处理请求 // 处理请求 $action = $_GET['action'] ?? ''; switch ($action) { case 'getAllMusic': $response = getAllMusic($conn); break; case 'getMusicTags': $response = getMusicTags($conn); break; case 'getMusicUrl': $response = getMusicUrl($conn); break; // --- 新增部分 --- case 'getAnnouncements': $response = getAnnouncements($conn); break; // --- 新增结束 --- default: $response = array( "success" => false, "message" => "无效的操作,请使用 action=getAllMusic、getMusicTags、getMusicUrl 或 getAnnouncements" ); } // 输出JSON响应 echo json_encode($response, JSON_UNESCAPED_UNICODE); // 关闭数据库连接 $conn->close(); ?>