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,titlemovies_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
相关产品推荐
相关产品推荐

