57

我有这个查询代码:

$repository = $em->getRepository('AcmeCrawlerBundle:Trainings');
       $query = $repository->createQueryBuilder('p')
               ->where('p.title LIKE :word')
               ->orWhere('p.discription LIKE :word')
               ->setParameter('word', $word)
               ->getQuery();
$trainings = $query->getResult();

问题是:即使存在匹配项,此查询也找不到它们。我用这段代码来查看完整的 sql:

print_r(array(
        'sql'        => $query->getSQL(),
        'parameters' => $query->getParameters(),
        ));

我有什么:

FROM Trainings t0_ WHERE t0_.title LIKE ? OR t0_.discription LIKE ? [parameters] => Array ( [word] => Spoken ) 

(查询的最后一部分)请告诉我要改变什么?

4

2 回答 2

115

您忘记了%单词周围的标志:

->setParameter('word', '%'.$word.'%')
于 2012-10-03T10:15:18.930 回答
29

以下是您可以采取的一些额外步骤来进一步清理输入数据。

您应该转义在百分号之间插入的术语:

->setParameter('word', '%'.addcslashes($word, '%_').'%')

百分号“%”和下划线符号“_”被解释为通配符LIKE。如果它们没有正确转义,攻击者可能会构建任意复杂的查询,从而导致拒绝服务攻击。此外,攻击者可能会获得他不应该获得的搜索结果。可以在此处找到攻击场景的更详细描述:https ://stackoverflow.com/a/7893670/623685

于 2017-12-31T10:49:52.710 回答