Benim Zend Framework 'alıntı' karışıklık

2 Cevap php

Ben Zend Framework kılavuzda veya başka bir tatmin edici (subjektif olarak görülen) bir cevap bulamıyorum hangi bir muhtemelen çok basit bir sorunu var ...

Ben bakış kaybetti ve muhtemelen genel alıntı ilgili bazı anlayış eksikliği bu benim sql sorguları benim php değişkenleri nasıl teslim edeceğini pek çok yolu vardır.

Prepared Statements

$sql =  "SELECT this, that
        FROM table
        WHERE id = ? AND restriction = ?";

$stmt = $this->_db->query($sql, array($myId, $myValue)); 
$result = $stmt->fetchAll();

Ben db benim için bu işler, çünkü bu çözüm ile ben bir şey teklif etmek gerekmez anlıyorum.

Querying Zend_Db_Table and _Row objects over the API

$ Users = new Kullanıcılar ();

a) $users->fetchRow('userID = ' . $userID);  
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  
c) $users->fetchRow('userID = ?', $userID);  
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));

Questions

Ben hiç kote değil çünkü) Tamam olmadığını anlıyoruz. Ama diğer sürümleri hakkında, ne iyi ne? C) deyimi gibi muamele ve otomatik alıntılanan ya da ben kullandığımda) d kullanmanıza gerek yok ediliyor? tanımlayıcı?

2 Cevap

Disclaimer: Bu bilgiler, bu cevabın orijinal gönderme tarih itibariyle geçerlidir. ZF sık sık değişir, bu bilgiler gelecek sürümleri ile eski haline gelebilir, ancak bu arşiv amaçlı değişmeden kalacaktır.

Eğer Zend_Db_Table_Abstract (yapıyorsun olan) bir alt sınıfı fetchRow() yöntemine bir dize geçirirseniz, bir {bir where bir parçası olarak kabul edilecektir [(3)]} örneği.

Diğer bir deyişle, içten, Zend_Db_Table yapar:

if (!($where instanceof Zend_Db_Table_Select)) {
    $select = $this->select();

    if ($where !== null) {
        $this->_where($select, $where);
    }

Yani ...:

a) $users->fetchRow('userID = ' . $userID);  

Tüm kote değildir.

b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  

Elle bir tamsayı olarak kote edilir.

c) $users->fetchRow('userID = ?', $userID);  

Otomatik olarak Zend_Db_Adapter_*::quoteInto() anar

d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));

Aslında çift sizin tarafınızdan bir kez, alıntı, ve bir kez alıntı otomatik yoluyla edilir.

Bildiğim kadarıyla "iyi" ile ilgili olarak, ben çerçevesi otomatik parametreli değeri quoteInto arayacak seçenek C öneriyoruz.

Keep in mind: Her zaman Zend_Db_Table_Select veya Zend_Db_Select fetchRow() yöntemi yerine bir örneğini geçebileceği ...

Yine, Zend_Db_Table_Abstract bir sınıfta, bu gibi görünecektir:

$this->fetchRow($this->select()->where('userID = ?', $userID));

Bunu yapmanın artı, SQL sorgusu sadece WHERE fıkrasında çok daha çok üzerinde kontrole sahip olarak, çok daha karmaşık sorgular oluşturabilirsiniz olmasıdır. Teorik olarak, kolayca yapabilirsiniz:

$select = $this->select()->where('userID = ?', $userID)
                         ->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn'));

$this->fetchRow($select);

Note: Zend_Db_Select bir örneğini geçerse, fetchRow() yöntemi tam fetchAll() except o içten çağırır gibi davranır bir parametre seçim nesnenin limit() yöntem olup, 1.

Ben alıştım

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);