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
);
搜索表单
创建一个简单的HTML表单,允许用户输入搜索关键词。表单提交到PHP处理脚本。
<form action="search.php" method="GET">
<input type="text" name="query" placeholder="搜索歌曲或歌手">
<button type="submit">搜索</button>
</form>
搜索处理
在PHP中处理搜索请求,连接数据库并执行查询。使用LIKE操作符进行模糊匹配。
<?php
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=music_db', 'username', 'password');
// 获取搜索词
$query = isset($_GET['query']) ? trim($_GET['query']) : '';
if (!empty($query)) {
// 准备SQL查询
$stmt = $db->prepare("SELECT * FROM songs WHERE title LIKE :query OR artist LIKE :query");
$stmt->bindValue(':query', '%' . $query . '%');
$stmt->execute();
// 获取结果
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
?>
显示结果
将搜索结果以列表形式展示,包括歌曲名称、歌手和播放链接。
<?php if (!empty($results)): ?>
<h3>搜索结果</h3>
<ul>
<?php foreach ($results as $song): ?>
<li>
<strong><?php echo htmlspecialchars($song['title']); ?></strong>
- <?php echo htmlspecialchars($song['artist']); ?>
<a href="play.php?id=<?php echo $song['id']; ?>">播放</a>
</li>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>没有找到匹配的歌曲。</p>
<?php endif; ?>
播放功能
创建一个简单的播放页面,根据歌曲ID从数据库获取文件路径并播放。
<?php
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=music_db', 'username', 'password');
// 获取歌曲ID
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
// 查询歌曲信息
$stmt = $db->prepare("SELECT * FROM songs WHERE id = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$song = $stmt->fetch(PDO::FETCH_ASSOC);
if ($song) {
// 输出播放器
echo '<h3>' . htmlspecialchars($song['title']) . '</h3>';
echo '<p>歌手: ' . htmlspecialchars($song['artist']) . '</p>';
echo '<audio controls>';
echo '<source src="' . htmlspecialchars($song['file_path']) . '" type="audio/mpeg">';
echo '您的浏览器不支持音频元素。';
echo '</audio>';
} else {
echo '<p>歌曲不存在。</p>';
}
?>
性能优化
对于大型音乐库,考虑添加全文索引以提高搜索效率。
ALTER TABLE songs ADD FULLTEXT(title, artist);
修改搜索查询以使用全文索引。
$stmt = $db->prepare("SELECT * FROM songs WHERE MATCH(title, artist) AGAINST(:query IN BOOLEAN MODE)");
$stmt->bindValue(':query', $query);
$stmt->execute();
安全考虑
确保所有用户输入都经过验证和转义,防止SQL注入和XSS攻击。使用预处理语句和htmlspecialchars函数。
$query = isset($_GET['query']) ? trim($_GET['query']) : '';
$query = filter_var($query, FILTER_SANITIZE_STRING);
分页功能
对于大量搜索结果,实现分页功能以提高用户体验。
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$limit = 10;
$offset = ($page - 1) * $limit;
$stmt = $db->prepare("SELECT * FROM songs WHERE MATCH(title, artist) AGAINST(: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();






