2

我正在尝试处理连接、mysql 和coldfusion。以下查询在没有最后一个条件的情况下有效。

        <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] 不存在。对不起,我边走边学……

4

3 回答 3

8

这里的问题是这DateFormat()是一个 ColdFusion 函数,它不能与 MySQL“变量”(w)一起应用。您需要使用MONTH()MySQL 的函数并将日期传递给它。

不要忘记清理表单输入,您很容易受到 SQL 注入的影响。像这样使用cfqueryparam

MONTH(w.start_date) = <cfqueryparam cfsqltype="cf_sql_integer" value="#form.home_by_month#" />
于 2016-08-31T20:00:47.300 回答
3

(评论太长了……)

由于您提到是 CF 新手,因此了解 CF 如何处理数据库查询的一些背景知识可能有助于理解错误发生的原因以及您可以(和不能)在 cfquery 中执行哪些类型的操作。

尽管 CF 可以与数据库引擎进行通信,但两者是完全不同的,并且使用完全不同的语言。您可以在 cfquery 标记中混合使用 CFML 和 SQL 的事实给人一种误导的印象,即 CF 函数可以对数据库对象进行操作(反之亦然)。他们不能。CF 服务器对数据库对象一无所知(数据库引擎也不了解 CFML)。查询标签中的任何 CFML 代码都会首先在 CF 服务器上进行处理。然后将生成的 SQL 发送到数据库引擎,并单独执行。

当 CF 服务器遇到数据库查询时,它会解析标签内容,寻找必须计算的 CFML 变量或表达式,即:

SELECT Column FROM Table WHERE ColA = '#form.someField#' AND ColB = '#form.otherField#'

然后它将这些变量和表达式转换为文字值,即字符串、数字等。最后,CF 将生成的SQL 字符串交给数据库引擎执行,即:

SELECT Column FROM Table WHERE ColA = 'John Smith' AND ColB = 'ABC'

所以CF卡住的原因#DateFormat(w.start_date, "m")#是它不理解w.start_date是指数据库列。它认为它是 CF 变量的名称:特别是一个名为“w”的结构,包含键“start_date”。显然不存在这样的变量。因此出现未定义的错误。

于 2016-09-01T03:33:56.710 回答
0

感谢 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>
于 2016-08-31T19:57:18.763 回答