ColdFusion 参数化查询

2024-04-17

我运行一个查询来填充我试图参数化的 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")#

有用。

有人能解释一下吗?


我的屏幕上没有出现任何 CFErrors,但我的 CFChart 是空白的。

忽略正确的做法 https://stackoverflow.com/a/27062906/104223暂时,发生这种情况的原因是您使用了不正确的cfsqltype对于参数。因此,您实际上向数据库发送了与您想象的不同的值(并因此执行了不同的比较)。结果,查询无法找到任何匹配的记录。这就是为什么你的图表是空白的。

通过使用cf_sql_timestamp您正在将“值”转换为完整的日期/时间对象。然而,YEAR() http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_year只返回一个四位数。所以你正在比较苹果和橙子。从概念上讲,您的查询实际上是这样做的:

  WHERE  2014 = {ts '2009-02-13 23:31:30'}

它不抛出错误的原因是日期/时间值在内部存储为数字。因此,您实际上是将一个小数字(即年份)与一个非常大的数字(即日期/时间)进行比较。显然,日期值会大得多,因此它几乎永远不会与年份数字匹配。再次,概念上您的查询正在执行以下操作:

 WHERE 2014 = 1234567890

由于 cfsqltype 是可选的,很多人认为它不是很重要 - 但它确实很重要。

  • 验证:除了其他好处之外,cfqueryparam 还根据以下内容验证提供的“值”cfsqltype(日期、日期和时间、数字等)。出现这种情况beforesql 被发送到数据库。因此,如果输入无效,您就不会浪费数据库调用。如果您省略 cfsqltype,或者仅使用默认的 ie 字符串,那么您将失去额外的验证。

  • Accuracy选择正确的 cfsqltype 可确保您将正确的值发送到数据库。如上所述,使用错误的类型可能会导致 CF 向数据库发送错误的值。

    The cfsqltype还确保以明确的格式将值提交到数据库,数据库将按照您期望的方式进行解释。从技术上讲,您可以将所有内容以字符串形式发送到数据库。但是,这会强制数据库执行隐式转换 https://dev.mysql.com/doc/refman/5.5/en/type-conversion.html(通常是不需要的)。

    通过隐式转换,字符串的解释完全取决于数据库 - 并且它可能并不总是能给出您期望的答案。将日期作为字符串而不是日期对象提交就是一个很好的例子。当前数据库将如何解释像“05/04/2014”这样的日期字符串? 4月5日还是5月4日?这取决于。更改数据库或数据库设置,结果可能完全不同。

确保结果一致的唯一方法是指定适当的 cfsqltype。它应该与比较列/函数的数据类型匹配,或者至少是等效类型。如果是YEAR(),它返回一个四位数。所以你应该使用cf_sql_integer, as 阿德里安提到了评论 https://stackoverflow.com/questions/27049918/coldfusion-parameterizing-a-querie#comment42618043_27050120。这同样适用于您的MONTH() https://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html比较。

 WHERE Year(ColumnName) = <cfqueryparam value="2014" cfsqltye="CF_SQL_INTEGER">
 AND   Month(ColumnName) = <cfqueryparam value="11" cfsqltye="CF_SQL_INTEGER"> 

说了这么多,丹的建议 https://stackoverflow.com/a/27062906/104223是执行日期比较的更好方法。那个范式 https://stackoverflow.com/questions/13666883/date-comparison-in-ms-sql-2005/13687006#13687006索引更加友好,无论您的目标列是否包含日期(仅)或日期和时间,都可以工作。注意使用cf_sql_date在他的例子中。

  • cf_sql_timestamp- 发送日期和时间
  • cf_sql_date- 仅发送日期。时间值被截断
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ColdFusion 参数化查询 的相关文章

  • 带有多表查询的 SQL Join 版本的 Djangoviews.py

    需要一些有关 Django 版本的 SQL 多表查询的帮助 该查询使用 3 个表来检索餐厅名称 地址Restaurants table和美食类型来自Cuisinetypes table 所有这些都基于通过 URL 传递的菜品名称 菜品 ID
  • Java日期格式转换

    我目前正在从请求对象中提取三个表单字段输入 日 月 年 该月的第 11 天为 Day 11 12 月为 12 月 今年将是 2010 年 我需要将其转换为 Java Date 对象 但由于发生了很多变化 我不确定将其存储在 java 对象中
  • MySQL - 选择字符串的前 10 个字节

    各位聪明的男士女士们 大家好 如何选择字符串的前 x 个字节 用例 我正在优化产品描述文本以上传到亚马逊 亚马逊按 utf8 中的字节 不是我之前所说的 latin1 而不是字符来测量字段长度 另一方面 MySQL 似乎是基于字符进行操作的
  • php 中的 PDOException“找不到驱动程序”

    我已经在 Linux 系统上安装了 Lampp 并且正在学习 symfony2 同时尝试使用 symfony2 命令创建架构 php app console doctrine schema create 我收到以下错误消息 PDOExcep
  • mysql JOIN,这是如何解释的?

    如果我为 mysql 编写一条 sql 查询 并且只指定 JOIN 没有外连接 内连接 左连接等 那么默认的连接类型是什么 例如 SELECT count FROM Students p JOIN 班级 c ON p studentId c
  • 为什么我收到错误 #1136 - 列计数与第 1 行的值计数不匹配?

    我收到此错误 1136 Column count doesn t match value count at row 1 当我尝试这样做时 INSERT INTO folding cartons part no description cou
  • mysql 日期与 date_format 的比较

    我用谷歌搜索并尝试了几种方法来比较日期 但不幸的是没有得到预期的结果 我的当前记录状态如下 mysql gt select date format date starttime d m Y from data date format dat
  • Ruby on Rails 安装问题 (Windows)

    我从 RuyInstaller 安装了 Ruby 2 0 0 和 DevKit 创建新项目时出现错误消息 rails new testtest d mysql a lot of output here Installing mysql2 0
  • 未找到列:1054 未知列 laravel

    所以我尝试用 laravel 制作一个表单 但除了新版本之外 他们删除了表单 但我可以让它运行 所以这里是 Route post register function user new User user gt u n Input get u
  • 使用 KMS 的 AWS RDS 加密是否会影响性能?

    Amazon states https aws amazon com about aws whats new 2015 01 06 amazon rds encryption with kms mysql postgresql that 加
  • Bash 脚本 Mysql 警告:在命令行界面上使用密码可能不安全

    你好 我有一个脚本来对一些 mysql 数据库进行分区 我们正在从 5 5 升级到 5 6 在测试脚本时 我注意到新的 5 6 版本 mysql 返回Warning Using a password on the command line
  • 通过页面打开 mysql 连接是完全鲁莽的吗?

    当查询数据库时 是否会感到极度偏执 每次必须完成新查询时 我都会打开和关闭 mysql 连接 我担心 尤其是启用 ajax 的页面 这会导致性能大幅下降 我应该继续使用此方法 还是至少在每个页面 而不是每个查询 中打开和关闭连接一次 顺便说
  • 连接两个表并保存到第三个sql

    我想加入两张桌子 TableA wordA primarykey countA abc 25 abcd 29 abcde 45 TableB wordB primarykey countB ab
  • CSV 损坏,如何修复?

    我正在尝试解析 CSV 我想将它放入数据库或只是用 JavaScript 解析它 但由于语法损坏 任何一种方法都会失败 我的整个 CSV 文件在这里 https gist github com 1023560 https gist gith
  • 安装MySQLdb(对于python)作为非压缩的egg

    安装说明是 python setup py build sudo python setup py install or su first 这给了我一个 egg 文件 如何告诉安装程序将文件转储为普通的未压缩库 Thanks 好吧 我不想回答
  • MySQL 主键是否已经处于某种默认顺序

    我刚刚在一个我刚刚开始使用的系统中偶然发现了几行我并不真正理解的代码 该系统有一个大表 可以保存大量具有唯一 ID 的实体 并在不再需要时将其删除 但绝不会重用它们 所以桌子看起来像这样 id info1 info2 info3 1 foo
  • 使用Python mysql.connector远程连接MySQL

    以下代码 在同一 LAN 内与 mysql 服务器不同的机器上运行 使用 Python3 和 mysql connector 本地连接到 MySQL 数据库 import mysql connector cnx mysql connecto
  • 插入值数组

    我有一个具有可变数量值的数组 除了内部带有查询的循环之外 是否有更有效或更好的方法将它们插入到我的数据库中 At 这个网站 http www desilva biz mysql insert html 有一个很好的 MySQL 多插入查询示
  • MySQL:错误 1215 (HY000):无法添加外键约束

    我读过了数据库系统概念 第六版 西尔伯沙茨 我将在 OS X 上的 MySQL 上实现第 2 章中所示的大学数据库系统 但我在创建表格时遇到了麻烦course 桌子department好像 mysql gt select from depa
  • 总小时数无法从 Android 插入 MySQL

    我使用以下公式获得总小时数 public void updateTotalHours int a SplitTime objMyCustomBaseAdapter getFistTime int b SplitTime objMyCusto

随机推荐