当前位置: 首页 > 面试题库 >

ColdFusion参数化查询

邹桐
2023-03-14
问题内容

我有一个查询,我试图填充我要参数化的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。屏幕上没有出现任何CFError,但是我的CFChart为空白。

我在查询中将其范围缩小到与此相关:

#dateFormat(theMonth,"yyyy")#" cfsqltype="CF_SQL_TIMESTAMP"

当我删除查询的此参数化部分并放入

#dateFormat(theMonth,"yyyy")#

有用。

谁能对此有所启发?


问题答案:

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

暂时忽略正确的方法,发生的原因是您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还确保值在无歧义的格式提交给数据库的数据库将解释你期望的方式。从技术上讲,您可以将所有内容发送到数据库。但是,这迫使数据库执行隐式转换(通常是不希望的)。

使用隐式转换时,字符串的解释完全由数据库决定-
并不一定总能得到您期望的答案。以日期而不是日期对象的形式提交日期是一个很好的例子。当前数据库将如何解释日期字符串,例如“
05/04/2014”?是4月5日还是5月4日?这取决于。更改数据库或数据库设置,结果可能会完全不同。

确保结果一致的唯一方法是指定适当的cfsqltype。它应与比较列/函数的数据类型匹配,或至少与等效类型匹配。对于YEAR(),它将返回一个四位数的数字。所以,你应该使用cf_sql_integer,因为阿德里安提到的意见。您的MONTH()比较也是如此。

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

说完这些,Dan的建议是执行日期比较的更好方法。该范例更加索引友好,并且不管您的目标列包含日期(仅)还是日期和时间,该范例都可以工作。请注意cf_sql_date在他的示例中的使用。

  • cf_sql_timestamp -发送日期和时间
  • cf_sql_date-仅发送日期。时间值被截断


 类似资料:
  • 问题内容: 我很难使用MySQLdb模块将信息插入到我的数据库中。我需要在表中插入6个变量。 有人可以帮我这里的语法吗? 问题答案: 提防对SQL查询使用字符串插值,因为它不能正确地转义输入参数,并使您的应用程序容易受到SQL注入漏洞的影响。 这种差异看似微不足道,但实际上它是巨大的 。 不正确(存在安全问题) 正确(带有转义符) 这增加了混乱,即用于绑定SQL语句中的参数的修饰符在不同的DB A

  • 问题内容: 我很难使用MySQLdb模块将信息插入到数据库中。我需要在表中插入6个变量。 有人可以帮我这里的语法吗? 问题答案: 提防对SQL查询使用字符串插值,因为它不能正确地转义输入参数,并使您的应用程序容易受到SQL注入漏洞的影响。这种差异看似微不足道,但实际上它是巨大的。 不正确(存在安全问题) 正确(带有转义符) 这增加了混淆,用于绑定SQL语句中的参数的修饰符在不同的DB API实现之

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 谁能给我示例如何在MySQL / PHP中使用参数化查询的例子? 问题答案: 参数化查询本质上是抽象出所有输入的查询。这具有几个良好的副作用,例如使所有输入无害(即不可能进行有害注入),并且由于它是预先分析和编译的,因此在重复使用时使其更快,

  • 我正在尝试查询一组多边形(在运行时传入)中的任何一个是否与存储在数据库中“enclosing_polygons”字段中的一组多边形相交,这是一个 MultiPolygonField。 下面是查询的示例: 这个查询可以很好地处理硬编码的值,但是当我试图参数化它时,Postgres似乎不能识别?当我试图填充多边形点时,将它们作为参数。 当我设置前两个参数(针对field1和field2)时,这些JDB

  • 问题内容: 什么是参数化查询?在PHP和MySQL中,这种查询的示例是什么? 问题答案: 参数化查询(也称为 预处理语句)是预编译SQL语句的一种方法,因此您需要提供的只是需要插入语句中的“参数”(认为“变量”)即可。被执行。它通常用作防止SQL注入攻击的手段。 您可以在PHP的PDO页面(PDO是数据库抽象层)上阅读有关这些内容的更多信息,但是如果您使用的是mysqli数据库接口,也可以使用它们

  • 问题内容: 我已经使用了参数化查询次数,我知道它有助于防止SQL注入。但是,我想知道我是否可以知道在参数化查询中防止SQL注入的基本逻辑是什么,原因很简单,但我不知道。我试图搜索google的基本知识,但是每次我找到一个示例,说明如何在Asp.net中使用参数化查询。 我知道制作一个特殊类来停止SQL注入中使用的特殊字符,例如(’,-etc),但是仅停止特殊字符会完全阻止SQL注入吗? .net参