0

私は次の例外を与えている次のコードを持っています、そして私は理由を理解することができません、どんな助けもいただければ幸いです。

無効なパラメーター番号:バインドされた変数の数がトークンの数と一致しません

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;
        }
4

2 に答える 2

1

最初の質問が問題です。クエリは次のようになります

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;
}

2番目の場所と場所を変更したことに注意してください。同じクエリビルダーで2つのwhere()を使用すると、最初のwhere()が2番目のwhere()で上書きされます。

于 2013-01-27T21:22:07.340 に答える
0

上記のコメントで述べたように、問題はクエリビルダーでの二重使用にあり->whereます。複数のwhere句を組み合わせる場合は、->andWhereまたは/およびを使用する必要があり->orWhereます。

また、結果をに変更しました。これにより->getOneOrNullResult()、教義の例外をキャッチするために使用したこのtry/catchブロック全体を使用する必要がなくなります。

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();
于 2013-01-28T14:24:52.680 に答える