#doctrine-orm #symfony #query-builder
#doctrine-orm #symfony #query-builder
Вопрос:
У меня есть следующий код, который выдает исключение Invalid parameter number: number of bound variables does not match number of tokens
. Тем не менее, когда я печатаю зарегистрированные параметры, отображается мой параметр.
public function getUnitPriceFor($entityType,$entityID,$qty,$configuration_id)
{
$this->qb = $this->getEntityManager()->createQueryBuilder();
$this->qb ->select($this->_entities[$entityType]['select'])
// for Base this would be ->select(array('t','c','w','g'))
// for the other cases below, like website, it's array('t','w')
->from('AcmeBundle:PriceTier', 't');
switch($entityType) :
case 'base' :
$this->qb ->leftJoin('t.customers','c')
->leftJoin('t.customergroups','g')
->leftJoin('t.websites','w');
break;
case 'website' :
$this->qb ->join('t.websites','w','WITH','w.id = '.$entityID);
break;
case 'custgrp' :
$this->qb ->join('t.customergroups','g','WITH','g.id = '.$entityID);
break;
case 'cust' :
$this->qb ->join('t.customers','t','WITH','t.id = '.$entityID);
break;
endswitch;
$this->qb ->where('t.printconfiguration = :configuration_id');
$this->qb ->setParameter('configuration_id', $configuration_id);
print_r( $this->qb->getParameters() );
$dql = $this->qb->getDQL();
echo"<pre>";
print_r($this->getEntityManager()->createQuery($dql)->getArrayResult());
echo"</pre>";
}
Печать $this->qb->getParameters();
показывает мне Array ( [configuration_id] => 1 )
, и удаление моих предложений where и set parameter предотвращает возникновение исключения. Наконец, (и получите это), если я удалю свое предложение where, но сохраню установленный параметр, исключения не произойдет. Я довольно смущен.
Комментарии:
1. Возникает ли исключение с каждым «случаем» или только с определенными? Кроме того, вы пробовали передавать $configuration_id непосредственно в ваше предложение WHERE вместо использования setParameter()?
2. Ах, другие случаи вызвали бы семантические ошибки из-за инструкции select — я исправил это, и да, все еще исключение в любом случае. Я попытался
where('t.printconfiguration = :configuration_id')->setParameter('configuration_id', $configuration_id);
, и все равно возникло то же исключение. Я мог бы передать его напрямую, как я сделал вcase
инструкциях, но это в значительной степени противоречит цели использования PDO…3. Рад, что вы нашли свой ответ. Не могли бы вы объяснить, что вы имеете в виду, говоря «противоречит цели использования PDO»? Я не возражаю — я просто передавал свои параметры напрямую, чтобы сохранить небольшой код, и мне любопытно, есть ли причина, по которой я не должен этого делать. Рад обсудить в чате, если это проще.
4. Вышеупомянутая функциональность в основном используется для подготовленных инструкций и хранимых процедур. Он также имеет некоторую встроенную защиту от sql-инъекций. Вот фрагмент из руководства по PHP о подготовленных операторах. Наконец, в этом небольшом руководстве есть раздел о заполнителях.
Ответ №1:
По-видимому, $dql = $this->qb->getDQL();
параметры передаваться не будут.
Мне нужно было изменить
$dql = $this->qb->getDQL();
echo"<pre>";
print_r($this->getEntityManager()->createQuery($dql)->getArrayResult());
echo"</pre>";
Для
$query = $this->qb->getQuery();
echo"<pre>";
print_r($query->getArrayResult());
echo"</pre>";