根据DBAL文档,仅将setFirstResult和setMaxResults方法设计为对SQL注入安全。但是在QueryBuilder部分中,他们提到为了安全地使用QueryBuilder,我们必须使用setParameter方法传递用户输入。所以我看到这样做的两种方法,但是我不知道它们是否有真正的区别:方式1:
$qb->select('USR_id', 'USR_email')
->from('T_user_USR')
->where('USR_email = ? ')
->setParameter(0, $email);
$stmtQb = $qb->execute();
$results = $stmtQb->fetchAll();
方式2:
$qb->select('USR_id', 'USR_email')
->from('T_user_USR')
->where('USR_email = ? ');
$stmtQb = $dbal->prepare($qb->getSQL());
$stmtQb->bindValue(1, $email);
$stmtQb->execute();
$results = $stmtQb->fetchAll();
最佳方法是什么?在此先感谢
这两个示例最终会做同样的事情。也就是说,当您使用setParameter()
时,参数值将使用bindValue()
绑定到语句。
使用第二种格式的唯一原因是,如果要使用bindParam()
而不是bindValue()
。如果要通过引用将参数绑定到PHP变量,则可以执行此操作,例如,这样就可以在开始循环之前准备一次查询,然后在循环中执行多次。
[这两种方法在SQL注入方面都提供相同数量的保护。