Php 向Doctirne Expr静态方法(例如Expr()->;eq(';p.var';,$var))提供变量是否安全?

Php 向Doctirne Expr静态方法(例如Expr()->;eq(';p.var';,$var))提供变量是否安全?,php,symfony,doctrine-orm,doctrine,doctrine-query,Php,Symfony,Doctrine Orm,Doctrine,Doctrine Query,向Doctirne Expr静态方法提供变量安全吗 如果必须将它们设置为参数,是否有更简单的方法,例如在$or->add()方法中 那么它可以是这样的: $or = $qb->expr()->orx(); if (!empty($sessionId)) { $or->add($qb->expr()->eq('up.session_id', $sessionId)); } if ($user instanceof User) { $or->add

向Doctirne Expr静态方法提供变量安全吗

如果必须将它们设置为参数,是否有更简单的方法,例如在$or->add()方法中

那么它可以是这样的:

$or = $qb->expr()->orx();
if (!empty($sessionId)) {
    $or->add($qb->expr()->eq('up.session_id', $sessionId));
}
if ($user instanceof User) {
    $or->add($qb->expr()->eq('up.user_id', $user->getId()));
}
到目前为止,我的丑陋解决方案是:

$qb = $this->getEntityManager()->createQueryBuilder();

$or = $qb->expr()->orx();
if (!empty($sessionId)) {
    $or->add($qb->expr()->eq('up.session_id', ':session_id'));
}
if ($user instanceof User) {
    $or->add($qb->expr()->eq('up.user_id', ':user_id'));
}

$qb->select('up')
    ->from('SCCatalogBundle:UserProject', 'up')
    ->where($or)
    ->OrderBy('up.updated', 'DESC');

if (!empty($sessionId)) {
    $qb->setParameter('session_id', $sessionId);
}
if ($user instanceof User) {
    $qb->setParameter('user_id', $user->getId());
}

$query = $qb->getQuery();

据我所知,您应该使用
setParameter
来避免SQL注入。 我想我没有必要按那个顺序设置参数。因此,您可以这样编写代码:

$qb = $this->getEntityManager()->createQueryBuilder();

$or = $qb->expr()->orx();
if (!empty($sessionId)) {
    $or->add($qb->expr()->eq('up.session_id', ':session_id'));
    $qb->setParameter('session_id', $sessionId);
}
if ($user instanceof User) {
    $or->add($qb->expr()->eq('up.user_id', ':user_id'));
    $qb->setParameter('user_id', $user->getId());
}

$qb->select('up')
    ->from('SCCatalogBundle:UserProject', 'up')
    ->where($or)
    ->OrderBy('up.updated', 'DESC');


$query = $qb->getQuery();

很明显。。。感谢您帮助我更好地了解QB原则是如何在内部工作的!