Php DBALQueryBuilder:避免SQL注入的更安全的方法是什么?

Php DBALQueryBuilder:避免SQL注入的更安全的方法是什么?,php,doctrine,sql-injection,query-builder,dbal,Php,Doctrine,Sql Injection,Query Builder,Dbal,根据DBAL文档,只有方法setFirstResult和setMaxResults被设计为不受SQL注入的影响。但在QueryBuilder一节中,他们提到为了安全地使用QueryBuilder,我们必须使用setParameter方法传递用户输入。 所以我看到了两种方法,但我不知道它们是否有真正的区别: 方式1: 方式2: $qb->select('USR_id', 'USR_email') ->from('T_user_USR') ->where('USR_email =

根据DBAL文档,只有方法setFirstResult和setMaxResults被设计为不受SQL注入的影响。但在QueryBuilder一节中,他们提到为了安全地使用QueryBuilder,我们必须使用setParameter方法传递用户输入。 所以我看到了两种方法,但我不知道它们是否有真正的区别: 方式1:

方式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()
绑定到语句

有关在DBAL中执行此操作的内部函数,请参见

使用第二个表单的唯一原因是如果您想使用
bindParam()
而不是
bindValue()
。如果希望通过引用将参数绑定到PHP变量,可以这样做,例如,这样可以在启动循环之前准备一次查询,然后在循环中多次执行


这两种方法在SQL注入方面都提供了相同的保护。

谢谢你的回答,比尔,理解DBAL的源代码对我来说有点困难,但我所看到的足以理解我的问题。我现在觉得很安全:DIt需要大量的实践来培养阅读其他源代码的技能。但这是一件值得实践的事情!
$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();