以下是我的代码摘录
$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 ***
我不完全确定我是以正确的方式做到这一点。因为如果我这样做,那么Doctrine2中就会出现一个错误(mssing功能?)。当我做的时候
$qb->expr()->like("u.".$column_name, "%$search_term%");
然后我绝对肯定我正在处理一个字符串。当整数或布尔值或浮点数等相互比较时,使用不同的运算符,但绝对不喜欢。 LIKE仅在处理字符串时使用,因此在DQL中引用字符串正是唯一可能的>类似方法用例。
请告诉我我做错了什么。我一直只使用Doctrine2几天,并对它感到着迷。但是不喜欢字符串没有被我自动引用。
答案 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)
请注意以下事项:
我是如何破解查询以提高数据库安全性的。
我使用"和其他"整个查询正在建立
我如何将已执行查询的值分配给$ 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;
}
要查看您创建的查询,请在" $ result"
之前添加$qb->getQuery():