Php 带有参数数组的SQL请求
我对SQL(dql)请求有问题, 我有一个包含书籍(媒体)的表,一个包含类别的表,以及一个关联这两个类别的表:CategoryAffiliation(一本书可以有多个类别) 在客户端,我可以通过检查多个类别来选择搜索书籍。然后,客户机向服务器发送一个类别数组,他必须返回至少包含其中一个类别的书籍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)
$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中查看时,您可以看到查询是如何使用条令执行的,它可能只是缺少引号或类似的内容。