Pembuat Kueri Doktrin tidak mendaftarkan parameter?

Saya memiliki kode berikut yang memunculkan pengecualian Invalid parameter number: number of bound variables does not match number of tokens. Namun ketika saya mencetak parameter terdaftar, parameter saya muncul.

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

Mencetak $this->qb->getParameters(); menunjukkan kepada saya Array ( [configuration_id] => 1 ), dan menghapus klausa parameter tempat dan pengaturan saya mencegah terjadinya pengecualian. Terakhir, (dan dapatkan ini), jika saya menghapus klausa Where tetapi tetap mempertahankan parameternya, tidak ada pengecualian yang terjadi. Saya agak bingung.


person Nick    schedule 10.11.2011    source sumber
comment
Apakah pengecualian terjadi pada setiap 'kasus' atau hanya pada kasus tertentu? Selain itu, sudahkah Anda mencoba meneruskan $configuration_id langsung ke klausa WHERE daripada menggunakan setParameter()?   -  person cantera    schedule 10.11.2011
comment
Ah, kasus lain akan menimbulkan kesalahan semantik karena pernyataan pilih -- Saya telah memperbaikinya, dan ya, masih merupakan pengecualian untuk kasus apa pun. Saya sudah mencoba where('t.printconfiguration = :configuration_id')->setParameter('configuration_id', $configuration_id); dan pengecualian yang sama masih terjadi. Saya dapat meneruskannya secara langsung seperti yang saya lakukan pada pernyataan case, tetapi hal itu menggagalkan tujuan penggunaan PDO...   -  person Nick    schedule 10.11.2011
comment
Senang Anda menemukan jawaban Anda. Bisakah Anda menjelaskan apa yang Anda maksud dengan mengalahkan tujuan penggunaan PDO? Saya bukannya tidak setuju -- Saya baru saja memasukkan parameter saya secara langsung untuk menyimpan sedikit kode, dan saya penasaran apakah ada alasan mengapa saya tidak boleh melakukan ini. Senang berdiskusi di chat jika lebih mudah.   -  person cantera    schedule 11.11.2011
comment
Fungsionalitas di atas terutama digunakan untuk pernyataan yang disiapkan dan prosedur tersimpan. Ia juga memiliki beberapa perlindungan injeksi sql yang melekat. Berikut cuplikan dari manual PHP tentang pernyataan yang telah disiapkan. Terakhir, tutorial kecil ini memiliki bagian tentang placeholder.   -  person Nick    schedule 14.11.2011


Jawaban (1)


Rupanya $dql = $this->qb->getDQL(); tidak akan melewatkan parameter.

Saya perlu berubah

$dql = $this->qb->getDQL();

echo"<pre>";
print_r($this->getEntityManager()->createQuery($dql)->getArrayResult());
echo"</pre>";

ke

$query = $this->qb->getQuery();

echo"<pre>";
print_r($query->getArrayResult());
echo"</pre>";
person Nick    schedule 10.11.2011