Vidi
Vidi

Reputation: 183

Doctrine parameters issue

I have the following piece of code that is giving the following exception and I can't figure out why, any help would be appreciated.

Invalid parameter number: number of bound variables does not match number of tokens

if (!empty($ids)) {
            $queryIds = implode(",", $ids);
            $query = $em->createQueryBuilder()
                        ->from('MainClientBundle:Posts','p')
                        ->select('p')
                        ->where('p.id >= :rand')
                        ->where('p.id NOT IN (:ids)')
                        ->orderBy('p.id','ASC')
                        ->setParameter('rand', rand(1, $max))
                        ->setParameter('ids', $queryIds)
                        ->setMaxResults(1);
        } else {
            $query = $em->createQueryBuilder()
                ->from('MainClientBundle:Posts','p')
                ->select('p')
                ->where('p.id >= :rand')
                ->orderBy('p.id','ASC')
                ->setParameter('rand', rand(1, $max))
                ->setMaxResults(1);
        }
        try {
            if($options['videos'] == "off"){
                $query->where("p.type <> :type")->setParameter("type",1);
            }
            if($options['sfw'] == "on"){
                $query->where("p.safeForWork <> :sfw")->setParameter("sfw",0);
            }
            $post = $query->getQuery()->getSingleResult();
        } catch (\Doctrine\Orm\NoResultException $e) {
            $post = null;
        }

Upvotes: 0

Views: 283

Answers (2)

Schwierig
Schwierig

Reputation: 712

As stated above in the comments the problems lies with the double usage of ->where in your querybuilder. If you want to combine multiple where clauses you need to use ->andWhere or/and ->orWhere.

Also I changed your result to ->getOneOrNullResult(), with that you don't need to use this whole try/catch block you used to catch the doctrine exception.

if (!empty($ids)) {
    $queryIds = implode(",", $ids);
    $query = $em->createQueryBuilder()
        ->from('MainClientBundle:Posts','p')
        ->select('p')
        ->where('p.id >= :rand')
        ->where('p.id NOT IN (:ids)')
        ->orderBy('p.id','ASC')
        ->setParameter('rand', rand(1, $max))
        ->setParameter('ids', $queryIds)
        ->setMaxResults(1);
} else {
    $query = $em->createQueryBuilder()
        ->from('MainClientBundle:Posts','p')
        ->select('p')
        ->where('p.id >= :rand')
        ->orderBy('p.id','ASC')
        ->setParameter('rand', rand(1, $max))
        ->setMaxResults(1);
}

if($options['videos'] == "off"){
    $query->where("p.type <> :type")->setParameter("type",1);
}
if($options['sfw'] == "on"){
    $query->where("p.safeForWork <> :sfw")->setParameter("sfw",0);
}

$post = $query->getQuery()->getOneOrNullResult();

Upvotes: 0

P. R. Ribeiro
P. R. Ribeiro

Reputation: 3029

Your first query is the problem. Your query should look like this

if (!empty($ids)) {
    $queryIds = implode(",", $ids);
    $query = $em->createQueryBuilder()
                ->from('MainClientBundle:Posts','p')
                ->select('p')
                ->where('p.id >= :rand')
                ->andWhere('p.id NOT IN (:ids)')
                ->orderBy('p.id','ASC')
                ->setParameter('rand', rand(1, $max))
                ->setParameter('ids', $queryIds)
                ->setMaxResults(1);
} else {
    $query = $em->createQueryBuilder()
        ->from('MainClientBundle:Posts','p')
        ->select('p')
        ->where('p.id >= :rand')
        ->orderBy('p.id','ASC')
        ->setParameter('rand', rand(1, $max))
        ->setMaxResults(1);
}
try {
    if($options['videos'] == "off"){
        $query->where("p.type <> :type")->setParameter("type",1);
    }
    if($options['sfw'] == "on"){
        $query->where("p.safeForWork <> :sfw")->setParameter("sfw",0);
    }
    $post = $query->getQuery()->getSingleResult();
} catch (\Doctrine\Orm\NoResultException $e) {
    $post = null;
}

Note that I changed your second where to andWhere. When you use two where() in the same query builder, the first gets overwritten by the second.

Upvotes: 1

Related Questions