如何在 Coldfusion8 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#)。它们始终是未定义的。

编辑
还行。这似乎有效:

应用程序.cfc 内部,我正在调用:

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

内部错误Msg.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>  

这似乎是很多代码...

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

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

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

这并不能解决您未定义的问题,但您应该继续前进(不要费心清理旧代码),但这使其更具可读性 imo。

要在函数中使用值,您需要将该值作为参数值传递到函数中,例如:

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

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

虽然您可以脱离函数的内部作用域并从主行访问变量,但这样做并不被认为是特别好的做法。

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

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

这里有

几件事需要考虑。 与其说是答案,不如说是一些观察:

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

<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#">

最新更新