Ben (sürüm 1.0 kadar) proje için takım kurşun iken ben veritabanı parametreleri ve Zend Framework alıntı için bir sürü kod yazdı.
Ben mümkün olduğunca en iyi uygulamaları teşvik etmek için çalıştı, ama ben kullanım kolaylığı ile bir denge vardı.
Bunu her zaman alıntı yapmaya karar nasıl görmek için, bir Zend_Db_Select
nesnesinin dize değerini incelemek unutmayın.
print $select; // invokes __toString() method
Ayrıca Zend_Db
tarafından sizin adınıza çalıştırılan SQL incelemek için Zend_Db_Profiler
kullanabilirsiniz.
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
İşte özel sorulara bazı cevaplar:
Zend_Db_Select::where('last_name=?', $lname)
Değerler uygun cinsindendir. "?
" parametresi tutucusu gibi görünüyor olsa da, bu yöntemde argüman aslında uygun alıntı ve interpolasyon. Bu yüzden gerçek bir sorgu parametresi değil. Aslında, aşağıdaki iki ifadeler yukarıdaki kullanım tam olarak aynı sorgu üretmek:
$select->where( $db->quoteInto('last_name=?', $lname) );
$select->where( 'last_name=' . $db->quote($lname) );
Eğer türü Zend_Db_Expr
bir nesne parametre geçirmek Ancak, o alıntı değil. Bu ifade değerleri desteklemek için, kelimesi kelimesine interpolasyon çünkü, SQL enjeksiyon risklerden sorumlu konum:
$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Kote veya ayrılmış gerektiğini ifade herhangi bir diğer kısmı sizin sorumluluğunuzdadır. Eğer ifadenin içine herhangi bir PHP değişkenleri interpolate örneğin eğer, güvenlik sizin sorumluluğunuzdadır. SQL anahtar kelimeler sütun adları varsa, quoteIdentifier()
ile onlara kendinizi sınırlandırmak gerekir. Örnek:
$select->where($db->quoteIdentifier('order').'=?', $myVariable)
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
Eğer AUTO_QUOTE_IDENTIFIERS
kapatmadığınız sürece tablo adı ve kolon isimleri, sınırlandırılır.
Değerler (interpolasyon değil) gerçek sorgu parametreleri gibi parametreli. Değeri, kelimesi kelimesine interpolated oluyor bu durumda bir Zend_Db_Expr
nesne olduğunu, bu yüzden sürece ifadeler eklemek veya NULL
ya da her neyse olabilir.
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
Eğer AUTO_QUOTE_IDENTIFIERS
kapatmadığınız sürece tablo adı ve kolon isimleri, sınırlandırılır.
Bu insert()
yönteminde olarak Zend_Db_Expr
nesneler olmadıkça değerler, parametreli bulunmaktadır.
$where
argüman tüm süzülmüş, böylece bu birinde herhangi bir SQL enjeksiyon risklerden sorumlu değilsin değildir. Sen daha rahat alıntı yapmak yardımcı olmak için quoteInto()
yöntemi yararlanabilirler.