带内部连接和日期格式的 Coldfusion CFQUERY 不工作
Coldfusion CFQUERY w/ Inner Join & Dateformat Not Working
我正在努力集中精力处理联接、mysql 和冷融合。以下查询在没有最后一个条件的情况下有效。
<cfquery name="GetWeekends">
SELECT w.id, w.weekend_type, w.community_id, w.start_date, w.end_date,
w.language,
c.community_id, c.location, c.language, c.state, c.country
FROM _weekends w
INNER JOIN _communities c
ON w.community_id=c.community_id
WHERE w.weekend_type = 1 AND w.start_date > Now() AND
#DateFormat(w.start_date, "m")# = '#form.home_by_month#'
ORDER BY w.start_date ASC
</cfquery>
它在
快要死了
#DateFormat(w.start_date, "m")#
告诉我变量 [W] 不存在。对不起,我边走边学...
工作解决方案是,感谢 Sterling Archer:
<cfquery name="GetWeekends">
SELECT w.id
, w.weekend_type
, w.community_id
, w.start_date
, w.end_date
, w.language
, c.community_id
, c.location
, c.language
, c.state
, c.country
FROM _weekends w INNER JOIN _communities c ON w.community_id = c.community_id
WHERE w.weekend_type = 1
AND w.start_date > Now()
AND MONTH(w.start_date) = '#form.home_by_month#'
ORDER BY w.start_date ASC
</cfquery>
这里的问题是 DateFormat()
是一个 ColdFusion 函数,不能与 MySQL "variable" (w
) 一起应用。您需要为 MySQL 使用 MONTH()
函数并将日期传递给它。
不要忘记清理您的表单输入,您很容易受到 SQL 注入。像这样使用 cfqueryparam:
MONTH(w.start_date) = <cfqueryparam cfsqltype="cf_sql_integer" value="#form.home_by_month#" />
(评论太长了...)
由于您提到自己是 CF 的新手,了解 CF 如何处理数据库查询的一些背景知识可能有助于理解错误发生的原因以及您可以(和不能)在 cfquery 中执行哪些类型的操作。
尽管 CF 可以与数据库引擎通信,但这两者是完全不同的,并且使用完全不同的语言。 您可以在 cfquery 标记中混合使用 CFML 和 SQL 这一事实给人一种误导印象,即 CF 函数可以对数据库对象进行操作(反之亦然)。他们不能。 CF 服务器对数据库对象一无所知(数据库引擎也不理解 CFML)。查询标记中的任何 CFML 代码都会在 CF 服务器上 first 进行处理。然后将生成的SQL发送到数据库引擎,单独执行。
当 CF 服务器遇到数据库查询时,它会解析标签内容,寻找必须计算的 CFML 变量或表达式,即:
SELECT Column FROM Table WHERE ColA = '#form.someField#' AND ColB = '#form.otherField#'
然后将这些变量和表达式转换为文字值,即字符串、数字等。最后,CF将generatedSQL字符串交给数据库引擎执行,即:
SELECT Column FROM Table WHERE ColA = 'John Smith' AND ColB = 'ABC'
所以 CF 在 #DateFormat(w.start_date, "m")#
上阻塞的原因是它不理解 w.start_date
指的是数据库列。它认为这是一个 CF 变量的名称:具体来说是一个名为 "w" 的结构,其中包含键 "start_date"。显然不存在这样的变数。因此出现未定义的错误。
我正在努力集中精力处理联接、mysql 和冷融合。以下查询在没有最后一个条件的情况下有效。
<cfquery name="GetWeekends">
SELECT w.id, w.weekend_type, w.community_id, w.start_date, w.end_date,
w.language,
c.community_id, c.location, c.language, c.state, c.country
FROM _weekends w
INNER JOIN _communities c
ON w.community_id=c.community_id
WHERE w.weekend_type = 1 AND w.start_date > Now() AND
#DateFormat(w.start_date, "m")# = '#form.home_by_month#'
ORDER BY w.start_date ASC
</cfquery>
它在
快要死了 #DateFormat(w.start_date, "m")#
告诉我变量 [W] 不存在。对不起,我边走边学...
工作解决方案是,感谢 Sterling Archer:
<cfquery name="GetWeekends">
SELECT w.id
, w.weekend_type
, w.community_id
, w.start_date
, w.end_date
, w.language
, c.community_id
, c.location
, c.language
, c.state
, c.country
FROM _weekends w INNER JOIN _communities c ON w.community_id = c.community_id
WHERE w.weekend_type = 1
AND w.start_date > Now()
AND MONTH(w.start_date) = '#form.home_by_month#'
ORDER BY w.start_date ASC
</cfquery>
这里的问题是 DateFormat()
是一个 ColdFusion 函数,不能与 MySQL "variable" (w
) 一起应用。您需要为 MySQL 使用 MONTH()
函数并将日期传递给它。
不要忘记清理您的表单输入,您很容易受到 SQL 注入。像这样使用 cfqueryparam:
MONTH(w.start_date) = <cfqueryparam cfsqltype="cf_sql_integer" value="#form.home_by_month#" />
(评论太长了...)
由于您提到自己是 CF 的新手,了解 CF 如何处理数据库查询的一些背景知识可能有助于理解错误发生的原因以及您可以(和不能)在 cfquery 中执行哪些类型的操作。
尽管 CF 可以与数据库引擎通信,但这两者是完全不同的,并且使用完全不同的语言。 您可以在 cfquery 标记中混合使用 CFML 和 SQL 这一事实给人一种误导印象,即 CF 函数可以对数据库对象进行操作(反之亦然)。他们不能。 CF 服务器对数据库对象一无所知(数据库引擎也不理解 CFML)。查询标记中的任何 CFML 代码都会在 CF 服务器上 first 进行处理。然后将生成的SQL发送到数据库引擎,单独执行。
当 CF 服务器遇到数据库查询时,它会解析标签内容,寻找必须计算的 CFML 变量或表达式,即:
SELECT Column FROM Table WHERE ColA = '#form.someField#' AND ColB = '#form.otherField#'
然后将这些变量和表达式转换为文字值,即字符串、数字等。最后,CF将generatedSQL字符串交给数据库引擎执行,即:
SELECT Column FROM Table WHERE ColA = 'John Smith' AND ColB = 'ABC'
所以 CF 在 #DateFormat(w.start_date, "m")#
上阻塞的原因是它不理解 w.start_date
指的是数据库列。它认为这是一个 CF 变量的名称:具体来说是一个名为 "w" 的结构,其中包含键 "start_date"。显然不存在这样的变数。因此出现未定义的错误。