php实现音乐搜索功能
数据库设计与歌曲表创建
在MySQL中创建歌曲表,存储音乐相关信息
CREATE TABLE songs (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
artist VARCHAR(255) NOT NULL,
album VARCHAR(255),
duration INT,
file_path VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
搜索表单界面构建
创建HTML搜索表单,允许用户输入关键词
<form action="search.php" method="get">
<input type="text" name="query" placeholder="搜索歌曲或歌手">
<button type="submit">搜索</button>
</form>
基本搜索功能实现
使用PHP处理搜索请求并查询数据库

$query = $_GET['query'] ?? '';
if (!empty($query)) {
$db = new PDO('mysql:host=localhost;dbname=music_db', 'username', 'password');
$stmt = $db->prepare("SELECT * FROM songs WHERE title LIKE :query OR artist LIKE :query");
$stmt->execute([':query' => "%$query%"]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
搜索结果展示页面
循环显示搜索结果并提供播放链接
foreach ($results as $song) {
echo "<div class='song-result'>";
echo "<h3>{$song['title']}</h3>";
echo "<p>艺术家: {$song['artist']}</p>";
echo "<audio controls><source src='{$song['file_path']}' type='audio/mpeg'></audio>";
echo "</div>";
}
高级搜索功能扩展
实现多条件组合搜索

$title = $_GET['title'] ?? '';
$artist = $_GET['artist'] ?? '';
$album = $_GET['album'] ?? '';
$conditions = [];
$params = [];
if (!empty($title)) {
$conditions[] = "title LIKE :title";
$params[':title'] = "%$title%";
}
if (!empty($artist)) {
$conditions[] = "artist LIKE :artist";
$params[':artist'] = "%$artist%";
}
$sql = "SELECT * FROM songs";
if (!empty($conditions)) {
$sql .= " WHERE " . implode(" AND ", $conditions);
}
搜索性能优化
为常用搜索字段添加索引
ALTER TABLE songs ADD INDEX idx_title (title);
ALTER TABLE songs ADD INDEX idx_artist (artist);
ALTER TABLE songs ADD INDEX idx_album (album);
模糊搜索改进
使用全文索引实现更灵活的搜索
ALTER TABLE songs ADD FULLTEXT(title, artist, album);
$stmt = $db->prepare("SELECT * FROM songs WHERE MATCH(title, artist, album) AGAINST(:query IN BOOLEAN MODE)");
$stmt->execute([':query' => $query]);
搜索结果分页处理
实现搜索结果分页显示
$page = $_GET['page'] ?? 1;
$limit = 10;
$offset = ($page - 1) * $limit;
$stmt = $db->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM songs WHERE title LIKE :query LIMIT :limit OFFSET :offset");
$stmt->bindValue(':query', "%$query%");
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$total = $db->query("SELECT FOUND_ROWS()")->fetchColumn();
$totalPages = ceil($total / $limit);





