mysql – 参数化查询的ColdFusion
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 参数化查询的ColdFusion,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3064字,纯文字阅读大概需要5分钟。
内容图文
我有一个查询,我运行以填充我试图参数化的CFChart:
<cfquery name="total" datasource="#datasource#">
SELECT *
FROM closed_tickets
WHERE MONTH(closed_date) = #month#
AND YEAR(closed_date) = #dateFormat(theMonth,"yyyy")#
AND technician_id = #techID#
</cfquery>
这是我尝试过的:
<!---Open tickets from chosen year where technician is active --->
<cfquery name="total" datasource="#datasource#">
SELECT *
FROM closed_tickets
WHERE MONTH(closed_date) = <CFQUERYPARAM Value="#month#">
AND YEAR(closed_date) = #dateFormat(theMonth,"yyyy")#" cfsqltype="CF_SQL_TIMESTAMP">
AND technician_id = <CFQUERYPARAM Value="#techID#">
</cfquery>
当我将查询更改为此时,它会以某种方式破坏我的CFChart.我没有在屏幕上看到任何CFErrors,但我的CFChart是空白的.
我在我的查询中将其缩小到与此相关:
#dateFormat(theMonth,"yyyy")#" cfsqltype="CF_SQL_TIMESTAMP"
当我删除查询的这个参数化部分,然后放
#dateFormat(theMonth,"yyyy")#
有用.
任何人都可以对此有所了解吗?
解决方法:
I don’t get any CFErrors on the screen but my CFChart is blank.
暂时忽略correct approach,发生的原因是您使用了不正确的cfsqltype参数.因此,您实际上是在向数据库发送不同的值(因此执行不同的比较),而不是您想到的.因此,查询无法找到任何匹配的记录.这就是为什么你的图表是空白的.
通过使用cf_sql_timestamp,您将“值”转换为完整的日期/时间对象.但是,YEAR()仅返回一个四位数字.所以你要比较苹果和橘子.从概念上讲,您的查询实际上是这样做的:
WHERE 2014 = {ts '2009-02-13 23:31:30'}
不抛出错误的原因是日期/时间值在内部存储为数字.所以你实际上是将一小部分(即年份)与一个非常大的数字(即日期/时间)进行比较.显然日期值会大得多,所以它几乎永远不会匹配年份数.同样,从概念上讲,您的查询是这样做的:
WHERE 2014 = 1234567890
由于cfsqltype是可选的,很多人认为它不是很重要 – 但确实如此.
>验证:除了其他好处之外,cfqueryparam还根据cfsqltype(日期,日期和时间,数字等)验证提供的“值”.这发生在sql被发送到数据库之前.因此,如果输入无效,则不会浪费数据库调用.如果省略cfsqltype,或者只使用默认的ie字符串,则会丢失额外的验证.
>准确性选择正确的cfsqltype可确保将正确的值发送到数据库.如上所述,使用错误的类型会导致CF向数据库发送错误的值.
cfsqltype还确保以非模糊格式将值提交给数据库,数据库将以您期望的方式解释.从技术上讲,您可以将所有内容发送到数据库中.但是,这会强制数据库执行implicit conversion(通常是不合需要的).
通过隐式转换,字符串的解释完全取决于数据库 – 并且它可能并不总能得出您期望的答案.将日期作为字符串而不是日期对象提交是一个很好的例子.当前数据库如何解释日期字符串,如“05/04/2014”? 4月5日还是5月4日?这取决于.更改数据库或数据库设置,结果可能完全不同.
确保一致结果的唯一方法是指定适当的cfsqltype.它应该与比较列/函数的数据类型匹配,或者至少与等效类型匹配.在YEAR()的情况下,它返回一个四位数字.所以你应该使用cf_sql_integer,如Adrian mentioned the comments.这同样适用于你的MONTH()比较.
WHERE Year(ColumnName) = <cfqueryparam value="2014" cfsqltye="CF_SQL_INTEGER">
AND Month(ColumnName) = <cfqueryparam value="11" cfsqltye="CF_SQL_INTEGER">
现在说了这么多,Dan’s suggestion是进行日期比较的更好方法.无论您的目标列是包含日期(仅)还是日期和时间,That paradigm都更加索引友好.请注意在他的示例中使用cf_sql_date.
> cf_sql_timestamp – 发送日期和时间
> cf_sql_date – 仅发送日期.时间值被截断
内容总结
以上是互联网集市为您收集整理的mysql – 参数化查询的ColdFusion全部内容,希望文章能够帮你解决mysql – 参数化查询的ColdFusion所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。