【问题标题】:SQL request with an array of arguments带有参数数组的 SQL 请求
【发布时间】:2017-06-20 17:23:24
【问题描述】:

我的 SQL(dql) 请求有问题, 我有一个带有 Books(Media) 的表格,一个带有类别的表格,以及一个将两者关联的表格: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);
        }
    }
}

这是我现在的解决方案,但这不是很好,我无法按结果订购.. 我收到一组重复的书籍,然后在客户端合并它们以删除重复的书籍。

我正在寻找一种方法来一次获取所有数据的单个请求

谢谢

【问题讨论】:

    标签: php mysql sql symfony doctrine-orm


    【解决方案1】:

    我无权访问我的东西来测试它,但这可以做到。我只是不确定 setParameter 将如何处理我将' 放在字符串中的事实。我认为您将需要获取原始信息。我不记得 symfony 和教义是如何管理它的,太长了;)

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

    $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 完成了请求,它正在工作!但不是在 PHP 中
    • 如果有人做一些操作,你肯定有SQL注入的风险,你可能需要根据情况进行检查。对于一个开放的网络应用程序,也许每个键都应该在之前转义,以确保你没有打开门。当您查看调试时,您可以看到查询是如何使用教义执行的,它可能只是缺少引号或类似的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2019-02-08
    相关资源
    最近更新 更多