Saya menulis banyak kode untuk parameter database dan mengutip di Zend Framework saat saya memimpin tim untuk proyek tersebut (hingga versi 1.0).
Saya mencoba mendorong praktik terbaik jika memungkinkan, tetapi saya harus menyeimbangkannya dengan kemudahan penggunaan.
Perhatikan bahwa Anda selalu dapat memeriksa nilai string dari Zend_Db_Select
objek, untuk melihat bagaimana ia telah memutuskan untuk melakukan kutipan.
print $select; // invokes __toString() method
Anda juga dapat menggunakan Zend_Db_Profiler
untuk memeriksa SQL yang dijalankan atas nama Anda oleh Zend_Db
.
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
Berikut adalah beberapa jawaban untuk pertanyaan spesifik Anda:
-
Zend_Db_Select::where('last_name=?', $lname)
Nilai dikutip dengan tepat. Meskipun "
?
" terlihat seperti placeholder parameter, dalam metode ini argumen sebenarnya dikutip dengan tepat dan diinterpolasi. Jadi itu bukan parameter kueri yang sebenarnya. Sebenarnya, dua pernyataan berikut menghasilkan kueri yang persis sama dengan penggunaan di atas:$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
Namun, jika Anda melewatkan parameter yang merupakan objek dengan tipe
Zend_Db_Expr
, maka itu tidak dikutip. Anda bertanggung jawab atas risiko injeksi SQL, karena ini diinterpolasi kata demi kata, untuk mendukung nilai ekspresi:$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Bagian lain dari ungkapan itu yang perlu dikutip atau dibatasi adalah tanggung jawab Anda. Misalnya, jika Anda menginterpolasi variabel PHP apa pun ke dalam ekspresi, keamanan adalah tanggung jawab Anda. Jika Anda memiliki nama kolom yang merupakan kata kunci SQL, Anda harus membatasinya sendiri dengan
quoteIdentifier()
. Contoh:$select->where($db->quoteIdentifier('order').'=?', $myVariable)
-
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
Nama tabel dan nama kolom dipisahkan, kecuali jika Anda menonaktifkan
AUTO_QUOTE_IDENTIFIERS
.Nilai diparameterisasi sebagai parameter kueri yang sebenarnya (tidak diinterpolasi). Kecuali jika nilainya adalah
Zend_Db_Expr
objek, dalam hal ini diinterpolasi kata demi kata, sehingga Anda dapat menyisipkan ekspresi atauNULL
atau apa pun. -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
Nama tabel dan nama kolom dipisahkan, kecuali jika Anda menonaktifkan
AUTO_QUOTE_IDENTIFIERS
.Nilai diparameterisasi, kecuali jika
Zend_Db_Expr
objek, seperti dalaminsert()
metode.$where
argumen tidak difilter sama sekali, jadi Anda bertanggung jawab atas risiko injeksi SQL apa pun di dalamnya. Anda dapat menggunakanquoteInto()
metode untuk membantu membuat kutipan lebih nyaman.