You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:01:14