PHP MVC路由问题:同一路由调用双函数+获取艺术家名称
解决方案
1. 先修正数据层的SQL错误与逻辑
你的getsongList方法存在参数缺失、SQL语法错误、未做防注入处理的问题,先修改GeneralManager中的该方法:
public function getsongList(string $artist): array { // 修正SQL语法,正确使用预处理占位符 $query = 'SELECT songs.ID_song , songs.title , songs.artist , genre.genre FROM songs JOIN genre ON songs.genre_ID_genre = genre.ID_genre WHERE songs.artist LIKE :artist'; $statement = $this->pdo->prepare($query); // 绑定参数时拼接%,实现模糊匹配 $statement->bindValue(':artist', "%{$artist}%", \PDO::PARAM_STR); $statement->execute(); return $statement->fetchAll(); }
2. 在当前路由方法中同时获取两类数据
不需要单独调用searchSongList函数(它是负责渲染另一页面的控制器方法),直接在searchSongById里整合逻辑,同时拿到当前歌曲信息和该艺术家的歌曲列表:
修改GeneralController的searchSongById方法:
public function searchSongById(int $id): string { $GeneralManager = new GeneralManager(); $song = $GeneralManager->selectSongById($id); // 处理歌曲不存在的边界情况 if (!$song) { return $this->twig->render('General/404.html.twig'); } // 通过当前歌曲的artist字段,获取该艺术家的所有歌曲 $artistSongs = $GeneralManager->getsongList($song['artist']); // 将两个数据变量一起传入Twig模板 return $this->twig->render('General/playPage.html.twig', [ 'song' => $song, 'artistSongs' => $artistSongs ]); }
3. 在Twig模板中展示数据
现在可以在playPage.html.twig里同时渲染当前歌曲信息和该艺术家的歌曲列表,示例:
<!-- 当前歌曲信息展示 --> <div class="current-song"> <h2>{{ song.title }}</h2> <p>艺术家:{{ song.artist }}</p> <img src="{{ song.image_url }}" alt="{{ song.title }}"> <audio src="{{ song.song_url }}" controls></audio> </div> <!-- 该艺术家的其他歌曲列表 --> <div class="artist-songs"> <h3>该艺术家的其他歌曲</h3> <ul> {% for item in artistSongs %} <li><a href="/play?id={{ item.ID_song }}">{{ item.title }}</a></li> {% endfor %} </ul> </div>
可选优化
如果不想在列表中显示当前正在播放的歌曲,可以修改getsongList的SQL,排除当前歌曲ID:
public function getsongList(string $artist, int $currentSongId): array { $query = 'SELECT songs.ID_song , songs.title , songs.artist , genre.genre FROM songs JOIN genre ON songs.genre_ID_genre = genre.ID_genre WHERE songs.artist LIKE :artist AND songs.ID_song != :currentSongId'; $statement = $this->pdo->prepare($query); $statement->bindValue(':artist', "%{$artist}%", \PDO::PARAM_STR); $statement->bindValue(':currentSongId', $currentSongId, \PDO::PARAM_INT); $statement->execute(); return $statement->fetchAll(); }
调用时传入当前歌曲ID:
$artistSongs = $GeneralManager->getsongList($song['artist'], $song['ID_song']);
内容的提问来源于stack exchange,提问作者chancho2207
相关产品推荐
相关产品推荐

