2014-10-01 16 views
5

Chúng tôi tôn giáo sử dụng cfqueryparam trong các truy vấn SQL của chúng tôi.Sử dụng cfqueryparam với các hằng số

Một số người tiền nhiệm của tôi dường như đã quá hăng hái khi sử dụng nó với các giá trị trực tiếp chứ không phải là biến.

Không phải là

record_is_deleted_bt = <cfqueryparam cfsqltype="cf_sql_bit" value="0"> 

overkill? Tôi có nghĩa là, không có cơ hội cho SQL injection và tôi không nghĩ rằng bằng cách sử dụng một biến ràng buộc ở đây không có gì hữu ích vis-à-vis cải thiện hiệu suất trong cơ sở dữ liệu. Nó sẽ không hợp lý để làm

record_is_deleted_bt = 0 

?

Có lợi thế nào khi sử dụng cfqueryparam trong trường hợp như vậy, ngoài việc ăn sâu thói quen sử dụng? Có bất lợi không?

+1

Không ai trong số đó tôi biết. Tôi từng là một trong những người quá hăng hái đó cho đến khi một trong những đồng nghiệp của tôi nói với tôi để thông minh. –

Trả lời

4

Không, đây không phải là quá mức cần thiết. Công việc đầu tiên của cfqueryparam là ràng buộc dữ liệu. Nó giúp trong phòng ngừa tiêm sql chỉ là tiền thưởng bổ sung. Các câu lệnh được chuẩn bị thông qua việc ràng buộc dữ liệu thực thi nhanh hơn. Bạn có sai lầm khi cho rằng nó có mặt để giúp ngăn chặn tấn công sql.
Lưu ý quan trọng: Tôi đang thêm trường hợp Kiểm tra do @Dan Bracuk cung cấp trên một oracle db.

<cfquery name="without" datasource="burns"> 
select count(*) 
from burns_patient 
where patientid = 1 
</cfquery> 

<cfquery name="with" datasource="burns"> 
select count(*) 
from burns_patient 
where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1"> 
</cfquery> 

<cfscript> 
TotalWithout = 0; 
TotalWith = 0; 
</cfscript> 

<cfloop from="1" to="1000" index="i" step="1"> 

    <cfquery name="without" datasource="burns" result="resultwithout"> 
    select count(*) 
    from burns_patient 
    where patientid = 1 
    </cfquery> 

    <cfquery name="with" datasource="burns" result="resultwith"> 
    select count(*) 
    from burns_patient 
    where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1"> 
    </cfquery> 

    <cfscript> 
    TotalWithout += resultwithout.executiontime; 
    TotalWith += resultwith.executiontime; 
    </cfscript> 

</cfloop> 

<cfdump var="With total is #TotalWith# and without total is #TotalWithout#."> 

Với tổng phạm vi từ 700 đến 900 tổng mili giây. Không có tổng phạm vi từ 1800 đến 4500 mili giây. Tổng số mà không có tổng số luôn ít nhất gấp đôi tổng số.

+2

Hãy tự do chứng minh rằng việc sử dụng parmameters truy vấn thay vì hằng số sẽ cải thiện hiệu suất. –

+1

với cfqueryparam, một kế hoạch thực hiện sẽ được chuẩn bị trong khi với một hằng số nó sẽ không, JDBC sẽ chỉ truyền toàn bộ chuỗi truy vấn. Tôi tin rằng truy vấn với một kế hoạch thực hiện sẽ chạy nhanh hơn. –

+0

Tôi muốn một thứ gì đó vững chắc hơn "Tôi tin". –

Các vấn đề liên quan