Php 带有参数数组的SQL请求

Php 带有参数数组的SQL请求,php,mysql,sql,symfony,doctrine-orm,Php,Mysql,Sql,Symfony,Doctrine Orm,我对SQL(dql)请求有问题, 我有一个包含书籍(媒体)的表,一个包含类别的表,以及一个关联这两个类别的表:CategoryAffiliation(一本书可以有多个类别) 在客户端,我可以通过检查多个类别来选择搜索书籍。然后,客户机向服务器发送一个类别数组,他必须返回至少包含其中一个类别的书籍 $books = []; if (isset($data['categories'])) { foreach ($data['categories'] as $key => $value)

我对SQL(dql)请求有问题, 我有一个包含书籍(媒体)的表,一个包含类别的表,以及一个关联这两个类别的表:CategoryAffiliation(一本书可以有多个类别)

在客户端,我可以通过检查多个类别来选择搜索书籍。然后,客户机向服务器发送一个类别数组,他必须返回至少包含其中一个类别的书籍

$books = [];
if (isset($data['categories'])) {
    foreach ($data['categories'] as $key => $value){
        $query = $em->createQuery("SELECT m
                                   FROM AppBundle:Media m, AppBundle:Category c, AppBundle:CategoryAffiliation mc
                                   WHERE m.idMedia = mc.idMedia
                                   AND mc.idCategory = :key
                                   GROUP by m.idMedia"
        )->setParameter('key',$key);
        $result = $query->getResult();
        foreach ($result as $book) {
            array_push($books, $book);
        }
    }
}
这是我目前的解决方案,但这不是很好,我不能根据结果订购。。 我收到一组重复的书籍,然后在客户端合并它们以删除重复的书籍

我正在寻找一种方法,一次请求获取所有数据


谢谢

我没有访问我的东西来测试它,但这可以做到。我只是不确定setParameter将如何处理我将
放入字符串中这一事实。我认为你需要获得原始信息。我不记得symfony和doctrine是怎么做到的,时间太长了;)

如果找不到其他方法,可以直接在字符串中构建它。。。我真的不推荐

$query = $em->createQuery("SELECT m
                           FROM AppBundle:Media m, AppBundle:Category c, AppBundle:CategoryAffiliation mc
                           WHERE m.idMedia = mc.idMedia
                                 AND mc.idCategory IN (:key)
                           GROUP by m.idMedia"
        )->setParameter('key',implode("','",array_keys($data['categories'])));

谢谢!我见过这种解决方法,但有人说这可能是SQL注入漏洞!我已经在PHPmyadmin中直接用纯SQL完成了请求,它正在工作!但不是在PhpIt中。如果有人进行某些操作,您肯定会有SQL注入的风险,您可能需要根据情况进行检查。对于一个开放的web应用程序,也许每个钥匙都应该在打开之前被释放,以确保你不会打开一扇门。当您在debug中查看时,您可以看到查询是如何使用条令执行的,它可能只是缺少引号或类似的内容。