ColdFusion 的 cfqueryparam 标记提供了一种便捷的机制,可以将值动态绑定到 SQL 查询。但是,使用不当可能会导致意外结果,例如空白 CFCharts。
使用日期值参数化查询时,必须指定正确的cfsqltype 作为参数。如本例所示,使用不正确的 cfsqltype(例如 CF_SQL_TIMESTAMP)进行 YEAR() 和 MONTH() 比较可能会中断查询的执行。
不正确的代码:
<code class="coldfusion"><CFQUERYPARAM Value="#month#" cfsqltype="CF_SQL_TIMESTAMP"> <CFQUERYPARAM Value="#dateFormat(theMonth,"yyyy")#" cfsqltype="CF_SQL_TIMESTAMP"></code>
使用错误的 cfsqltype 会导致参数值与数据库中的比较列之间的类型不匹配。例如,YEAR() 返回一个四位整数,而 CF_SQL_TIMESTAMP 表示完整的日期/时间对象。这种不匹配会导致比较不正确:
<code class="text">2014 = {ts '2009-02-13 23:31:30'}</code>
底层数据库自动将参数值转换为数字,导致比较错误,查询没有找到匹配的记录。
要解决该问题,请为参数指定适当的cfsqltype,确保数据类型与数据库中的列类型匹配:
<code class="coldfusion"><CFQUERYPARAM Value="#month#" cfsqltype="CF_SQL_INTEGER"> <CFQUERYPARAM Value="#dateFormat(theMonth,"yyyy")#" cfsqltype="CF_SQL_INTEGER"></code>
替代方法:
作为参数化各个日期组件的替代方法,更好的方法是使用 cf_sql_date 作为 cfsqltype 进行日期比较:
<code class="coldfusion"><CFQUERYPARAM Value="#dateFormat(theMonth,"yyyy-mm-dd")#" cfsqltype="CF_SQL_DATE"></code>
这种方法对索引更加友好,并且无论目标列包含日期还是日期/时间值,都能确保准确的比较。
以上是使用带有日期值的参数化查询时,为什么我的 ColdFusion cfcharts 为空?的详细内容。更多信息请关注PHP中文网其他相关文章!