如何在Coldfusion8 cffunction标签中引用数据库变量?

时间:2012-04-29 15:41:19

标签: variables coldfusion cffunction

我正在Coldfusion8做我的第一步。我设法用我正在调用的cffunction设置一个组件/服务。

在函数内部,我需要构造一个包含错误和相应错误消息的2x2表。错误消息是多语言的并存储在MySQL表中。

问题:

我找不到从 CFFunction 标记内部引用变量的方法。这不起作用:

// select from database
<cfparam name="Session.Sprache" default="DE">
    <cfquery datasource="iln" name="texte">
        SELECT *
        FROM languages
        WHERE sprache = "#Session.lang#"
     </cfquery>

<cffunction name="createErrMsgsLog" returntype="object">
    // create and populate 
    <cfset allErrMsgs=ArrayNew(2)>
    <cfset allErrMsgs[1][1]="firma">
    // not defined
    <cfset allErrMsgs[1][2]="#tx_validate_firma#">
    ....
 </cffunction>

问题:
如何在 CFfunction 中正确引用我的变量#tx_validate_firma#。它们总是未定义的。

修改
好。这似乎有效:

application.cfc 里面我打电话:

<cfinvoke component="services.errorMsg"
     method="createErrMsgsLog"          
     returnvariable="errMsgs">
</cfinvoke>         

errorMsg.cfc 里面我正在做:

<cfcomponent displayname="errorMsg">    
    <cffunction name="createErrMsgsLog">
        <cfquery datasource="mine" name="texte">
            SELECT *
            FROM sprachen
            WHERE sprache = "#Session.Sprache#"
        </cfquery>
        <cfoutput query="texte">
            // column name = value
            <cfset "#trim(bezeichner)#" = "#trim(textinhalt)#">
        </cfoutput>
        // build array
        <cfset allErrMsgs=ArrayNew(2)>
        <cfset allErrMsgs[1][1] = "firma">
        <cfset allErrMsgs[1][2] = #tx_validate_firma#>
        ...

        <cfset errMsgs = serializeJSON(allErrMsgs)>
        <cfreturn errMsgs>
    </cffunction>
</cfcomponent>  

这看起来好像很多代码......

3 个答案:

答案 0 :(得分:1)

这里只是一个最佳实践答案。引用变量时,您只需引用名称,无需使用##。

例如 <cfset "#trim(bezeichner)#" = "#trim(textinhalt)#">

可以是<cfset "#trim(bezeichner)#" = trim(textinhalt)>

这并不能解决您未定义的问题,但是您应该继续前进(不要打扰清理旧代码),但这会让它更具可读性。

答案 1 :(得分:0)

要在函数内部使用值,您需要将值作为参数值传递给函数,例如:

<cffunction name="createErrMsgsLog" returntype="object">
    <cfargument name="someName" [etc]>

然后在函数中将其引用为arguments.someName。

虽然你可以突破你的功能的内部范围并从主线访问变量,但这并不是特别好的做法。

另一个考虑因素可能是将您的函数抽象为CFC文件中的组件定义,而不是仅仅在“主线”代码中定义它们。这使得更整洁,更连贯的代码,并使其更可重用。也就是说,通常也有理由在内联中定义一次性功能。但也许值得调查一下:

http://livedocs.adobe.com/coldfusion/8/htmldocs/buildingComponents_01.html#1266855

答案 2 :(得分:0)

这里要考虑几件事情。与某些观察结果相比,答案并非如此:

为了您自己的理智,那些必须维护您的代码的人以及那些想要帮助的人,请不要在查询中使用“select *”。从我在这里看到的评论中,在名为texte的查询中返回tx_validate_firma。如果代码明确说:

<cfquery datasource="iln" name="texte">
    SELECT tx_validate_firma, etc
    FROM languages
    WHERE sprache = "#Session.lang#"
 </cfquery>

我们都知道价值来自哪里。哦,请在where子句中查看使用cfqueryparam。

我认为这有效,虽然看起来很奇怪:

<cfset allErrMsgs[1][2] = #tx_validate_firma#>

由于没有明确说明tx_validate_firma的范围,我们的局外人仍然在摸不着头脑,因为有人试图稍后继续这样做。

<cfset allErrMsgs[1][2] = texte.tx_validate_firma>

请注意,您不需要在此类作业中使用#。通常在ColdFusion标记内,除非您在引号内,否则不需要它们。像这样:

<cfset fullName = "#firstName# #middleInitial# #lastName#">