c mysql 参数化查询_mysql – 参数化查询的ColdFusion

我有一个查询,我运行以填充我试图参数化的CFChart:

SELECT *

FROM closed_tickets

WHERE MONTH(closed_date) = #month#

AND YEAR(closed_date) = #dateFormat(theMonth,"yyyy")#

AND technician_id = #techID#

这是我尝试过的:

SELECT *

FROM closed_tickets

WHERE MONTH(closed_date) =

AND YEAR(closed_date) = #dateFormat(theMonth,"yyyy")#" cfsqltype="CF_SQL_TIMESTAMP">

AND technician_id =

当我将查询更改为此时,它会以某种方式破坏我的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) =

AND Month(ColumnName) =

现在说了这么多,Dan’s suggestion是进行日期比较的更好方法.无论您的目标列是包含日期(仅)还是日期和时间,That paradigm都更加索引友好.请注意在他的示例中使用cf_sql_date.

> cf_sql_timestamp – 发送日期和时间

> cf_sql_date – 仅发送日期.时间值被截断

标签:mysql,coldfusion

来源: https://codeday.me/bug/20190919/1812676.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值