Coldfusion CFQUERY w / Inner Join&日期格式不起作用

时间:2016-08-31 19:46:58

标签: mysql coldfusion cfml lucee

我正在试图处理联接,mysql和coldfusion。以下查询在没有最后条件的情况下工作。

def get_multiple_dummies(dframe):
    from functools import reduce
    combined = [pd.get_dummies(dframe.iloc[:, i]) for i in range(len(dframe.columns))]
    allcolumns = set(reduce(list.__add__, map(lambda y: y.columns.tolist(), 
        combined)))
    combined = map(lambda x: pd.concat([x, pd.DataFrame(
        columns = filter(lambda y: y not in x.columns, 
        allcolumns))]), combined)
    return reduce(lambda x,y: x.fillna(0)+y.fillna(0), combined)

print get_multiple_dummies(qq1)

   aus  bel  chn  fra  gbr  prt
0    1    0    0    1    1    0
1    0    0    0    0    1    1
2    0    0    1    0    0    0
3    0    1    0    0    1    0
4    0    0    0    0    1    1
5    0    0    0    0    1    1
6    0    0    0    0    1    1

[7 rows x 6 columns]

它正在消亡

        <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>
告诉我变量[W]不存在。对不起,我在这里学习...

3 个答案:

答案 0 :(得分:8)

这里的问题是DateFormat()是一个ColdFusion函数,并且不能应用于MySQL&#34;变量&#34; (w)。您需要使用MySQL的MONTH()函数并将日期传递给它。

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

MONTH(w.start_date) = <cfqueryparam cfsqltype="cf_sql_integer" value="#form.home_by_month#" />

答案 1 :(得分: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”。显然不存在这样的变量。因此未定义的错误。

答案 2 :(得分: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>