Tôi đã viết rất nhiều mã cho các tham số cơ sở dữ liệu và trích dẫn trong Zend Framework trong khi tôi là trưởng nhóm của dự án (lên đến phiên bản 1.0).
Tôi đã cố gắng khuyến khích các phương pháp hay nhất nếu có thể, nhưng tôi phải tạo ra sự cân bằng để dễ sử dụng.
Lưu ý rằng bạn luôn có thể kiểm tra giá trị chuỗi của Zend_Db_Select
để xem nó đã quyết định thực hiện trích dẫn như thế nào.
print $select; // invokes __toString() method
Ngoài ra, bạn có thể sử dụng Zend_Db_Profiler
để kiểm tra SQL do Zend_Db
chạy thay mặt bạn .
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
Dưới đây là một số câu trả lời cho các câu hỏi cụ thể của bạn:
-
Zend_Db_Select::where('last_name=?', $lname)
Giá trị được trích dẫn một cách thích hợp. Mặc dù "
?
"trông giống như một trình giữ chỗ tham số, trong phương thức này, đối số thực sự được trích dẫn một cách thích hợp và được nội suy. Vì vậy, nó không phải là một tham số truy vấn đúng. Thực tế, hai câu lệnh sau tạo ra cùng một truy vấn như cách sử dụng ở trên:$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
Tuy nhiên, nếu bạn truyền một tham số là một đối tượng thuộc loại
Zend_Db_Expr
, thì nó không được trích dẫn. Bạn chịu trách nhiệm về rủi ro chèn SQL, vì nó được nội suy nguyên văn, để hỗ trợ các giá trị biểu thức:$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Bất kỳ phần nào khác của biểu thức đó cần được trích dẫn hoặc phân tách là trách nhiệm của bạn. Ví dụ:nếu bạn nội suy bất kỳ biến PHP nào vào biểu thức, bạn có trách nhiệm đảm bảo an toàn. Nếu bạn có tên cột là từ khóa SQL, bạn cần tự phân tách chúng bằng
quoteIdentifier()
. Ví dụ:$select->where($db->quoteIdentifier('order').'=?', $myVariable)
-
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
Tên bảng và tên cột được phân cách, trừ khi bạn tắt
AUTO_QUOTE_IDENTIFIERS
.Giá trị được tham số hóa dưới dạng tham số truy vấn đúng (không nội suy). Trừ khi giá trị là
Zend_Db_Expr
đối tượng, trong trường hợp đó nó là nguyên văn nội suy, vì vậy bạn có thể chèn biểu thức hoặcNULL
hoặc bất cứ điều gì. -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
Tên bảng và tên cột được phân cách, trừ khi bạn tắt
AUTO_QUOTE_IDENTIFIERS
.Các giá trị được tham số hóa, trừ khi chúng là
Zend_Db_Expr
các đối tượng, như tronginsert()
phương pháp.$where
đối số hoàn toàn không được lọc, vì vậy bạn phải chịu trách nhiệm về bất kỳ rủi ro tiêm SQL nào trong đối số đó. Bạn có thể sử dụngquoteInto()
để giúp việc trích dẫn thuận tiện hơn.