Doctrine2查询构建器不引用该字符串

时间:2015-05-01 11:06:46

标签: php doctrine-orm

以下是我的代码摘录

$column_name = "ipAddress";
$qb = EntityManagerContainer::get()->createQueryBuilder();
$qb->select('u')
    ->from(BlacklistedIps::class, 'u');

if($search_term)
{   
    $clause = $qb->expr()->like("u.".$column_name, "'%$search_term%'");
    $qb->where($clause);
}

$query = $qb->getQuery();

$result = $query->getResult();

它的工作原理非常好(虽然它对SQL注入是开放的,但这是另一个故事)。

我的问题是需要"'%$search_term%'"。如果没有这组额外的单引号,查询将失败

  

带有消息的未捕获异常'Doctrine \ ORM \ Query \ QueryException'   'SELECT u FROM Orm \ Entity \ BlacklistedIps u WHERE u.ipAddress LIKE   %123%ORDER BY u.reason desc'in ***

我不完全确定我是以正确的方式做到这一点。因为如果我这样做,那么Doc​​trine2中就会出现一个错误(mssing功能?)。当我做的时候

$qb->expr()->like("u.".$column_name, "%$search_term%");

然后我绝对肯定我正在处理一个字符串。当整数或布尔值或浮点数等相互比较时,使用不同的运算符,但绝对不喜欢。 LIKE仅在处理字符串时使用,因此在DQL中引用字符串正是唯一可能的>类似方法用例。

请告诉我我做错了什么。我一直只使用Doctrine2几天,并对它感到着迷。但是不喜欢字符串没有被我自动引用。

2 个答案:

答案 0 :(得分:9)

它看起来像你如何使用querybuilder的问题。你应该这样做:

$qb ->where($qb->expr()->orX($qb->expr()->like('u.'.$column_name, $qb->expr()->literal("%$searchTerm%"))))  

$qb->where($qb->expr()->like("u.".$column_name, array("%$searchTerm%")));  

还要避免sql注入,一个好的做法是不在任何querybuilder方法中传递用户输入,使用setParameter?或者:相反。

$qb->where('u.'.$column_name.' LIKE :searchTerm')
$qb->setParameter('searchTerm', '%'.$searchTerm.'%')  

或类似的东西:

$qb->expr()->like('u.'.$column_name, '?1')
$qb->getQuery()->setParameter(1, '%' . $searchTerm . '%');

答案 1 :(得分:1)

请注意以下事项:

  1. 我是如何破解查询以提高数据库安全性的。

  2. 我使用"和其他"整个查询正在建立

  3. 我如何将已执行查询的值分配给$ result

    public function findPending($id)
    {
    $qb = $this->createQueryBuilder('o')
        ->addSelect('s')
        ->leftJoin('MyApp\\Model\\Entity\\Shipment', 's')
        ->orderBy('o.date_sent', 'DESC');
    
        // Order has been sent and was not cancelled
    $qb 
        ->andWhere($qb->expr()->andX(
            $qb->expr()->eq('o.date_cancelled','0000-00-00 00:00:00'),
            $qb->expr()->neq('o.date_sent','0000-00-00 00:00:00')
            ));
    
    $qb
        ->andWhere($qb->expr()->orX(
            // Order doesn't have a shipment
            $qb->expr()->isNull('s.order'),
            // OR Order has a shipment
            $qb->expr()->orX(
                // Shipment has not been sent
                $qb->expr()->eq('s.date_sent','0000-00-00 00:00:00'),
                // OR Shipment has been sent AND it was cancelled
                $qb->expr()->andX(
                    $qb->expr()->neq('s.date_sent','0000-00-00 00:00:00'),
                $qb->expr()->eq('s.date_cancelled','0000-00-00 00:00:00')
                    )
                )
            ));
    
    $qb
        ->setMaxResults(6);
    
    $result = $qb->getQuery()
        ->getResult();
    
    return $result;
    }
    
  4. 要查看您创建的查询,请在" $ result"

    之前添加
    $qb->getQuery():