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

Symfony QueryBuilder内连接子句语法错误排查求助

Symfony QueryBuilder 语法错误排查

问题场景

尝试在Symfony中使用QueryBuilder,通过内连接结合URL路由传入的$genre参数过滤movies表数据,代码如下:

#[Route('/api/movies/genre/{genre}')]
public function listFiltered(Connection $db, $genre): Response
{
    $query = $db->createQueryBuilder()
        ->select("m.*")
        ->from("movies", "m")
        ->innerJoin('m', 'movies_genres', 'mg', 'mg.movie_id = m.id')
        ->where('mg.genre_id =' ,$genre)
        ->setMaxResults(50)
        ->executeQuery()
        ->fetchAllAssociative();
    dd($query);
    return $this->json([
        "filtered" => $query
    ]);
}

数据库结构

  • movies表:id, rank, release_data, title
  • movies_genres表:movie_id, genre_id

错误信息

An exception occurred while executing a query: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') AND (Action) LIMIT 50' at line 1

问题原因与解决方案

问题根源

where方法的参数使用错误:QueryBuilder的where()方法不能直接将参数值作为第二个参数传入,这种写法会导致SQL语法结构混乱,生成的SQL会把$genre的值当成独立条件,出现类似) AND (Action)的错误语法,同时字符串值未被正确包裹引号,还存在SQL注入风险。

修正代码

改用占位符绑定参数的方式,以下两种写法均可:

写法一:命名占位符

$query = $db->createQueryBuilder()
    ->select("m.*")
    ->from("movies", "m")
    ->innerJoin('m', 'movies_genres', 'mg', 'mg.movie_id = m.id')
    ->where('mg.genre_id = :genre')
    ->setParameter('genre', $genre)
    ->setMaxResults(50)
    ->executeQuery()
    ->fetchAllAssociative();

写法二:问号占位符

$query = $db->createQueryBuilder()
    ->select("m.*")
    ->from("movies", "m")
    ->innerJoin('m', 'movies_genres', 'mg', 'mg.movie_id = m.id')
    ->where('mg.genre_id = ?')
    ->setParameter(0, $genre)
    ->setMaxResults(50)
    ->executeQuery()
    ->fetchAllAssociative();

这种方式会自动处理字符串的引号包裹,同时避免SQL注入问题,生成的SQL语法结构也会完全正确。

内容的提问来源于stack exchange,提问作者user21357629

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:27:11