Coldfusion 新手,非常基本的积垢通过Application.cfc

Coldfusion 新手,非常基本的积垢通过Application.cfc,coldfusion,coldfusion-8,Coldfusion,Coldfusion 8,所以我一直在使用正确的术语?ColdFusion代码来运行我所有的页面,我认为我已经对基本知识有了相当的了解,并希望采取下一步行动。经过大量的交叉引用、研究和尝试和错误,我提出了以下4个页面,其目的是能够在page crud.cfm表单中输入用户名和密码,然后在提交后,将用户重定向到一个页面,该页面显示新输入的数据以及任何过去的条目 我可以用简单的内联代码和Application.CFM来完成所有这些,但我想朝着更面向对象/模块化的方向发展,因为目前我发现自己在几个不同的页面上重写/复制粘贴大量

所以我一直在使用正确的术语?ColdFusion代码来运行我所有的页面,我认为我已经对基本知识有了相当的了解,并希望采取下一步行动。经过大量的交叉引用、研究和尝试和错误,我提出了以下4个页面,其目的是能够在page crud.cfm表单中输入用户名和密码,然后在提交后,将用户重定向到一个页面,该页面显示新输入的数据以及任何过去的条目

我可以用简单的内联代码和Application.CFM来完成所有这些,但我想朝着更面向对象/模块化的方向发展,因为目前我发现自己在几个不同的页面上重写/复制粘贴大量代码。从“crud.cfm”提交时出现的错误是:

cfinvoke标记中的组件属性具有无效值

我试过了,没有哈希,也没有大写字母A,但都没有用。这是我的非工作代码:

Application.cfc

<cfcomponent output="false">
<cffunction name="insertrecord" access="public" output="false">
    <cfargument name="data" type="struct" required="true">
    <cfquery name="create" datasource="test">
        INSERT INTO logins(
            username,
            password)
        VALUES(
            'trim(form.username)',
            'trim(form.password)')
    </cfquery>
</cffunction>
</cfcomponent>
积垢

<h3> Enter new user/password </h3>

<cfform name="thisform" method="post" action="procpage.cfm">
    Username:<cfinput type="text" name="username" value="">
    Password:<cfinput type="password" name="password" value="">
    <input type="submit" value="submit">
</cfform>
procpage.cfm

<cfif !StructIsEmpty(form)>
<cfinvoke component="#Application#" method="insertrecord">
    <cfinvokeargument name="data" value="#form#">
</cfinvoke>
</cfif>

<cflocation url="resultpage.cfm" addtoken="no">
resultpage.cfm

<cfquery name="read" datasource="test">
SELECT * FROM logins
</cfquery>

<table>
<tr>
    <th>LOGIN</th>
    <th>USERNAME</th>
    <th>PASSWORD</th>
</tr>
<cfloop query="read">
<tr>
    <td>#read.login#</td>
    <td>#read.username#</td>
    <td>#read.password#</td>
</tr>
</cfloop>   
</table>
ColdFusion版本8,MSSQL 2005数据库。
提前感谢大家的帮助,期待您的回复

Application.cfc是ColdFusion中的一个特殊文件


您需要将组件命名为其他名称。Application.cfc是您放置应用程序事件、设置代码等的地方。

回答您向Miguel提出的问题,是的。每次调用cfm时都会调用application.cfc。因此,当您点击crud.cfm时,application.cfc将运行。当您点击procpage.cfm application.cfc runs等时

所以您希望procpage.cfm看起来更像

<cfif !StructIsEmpty(form)>
<cfinvoke component="functions" method="insertrecord">
    <cfinvokeargument name="data" value="#form#">
</cfinvoke>
</cfif>
<cfcomponent output="false">
<cffunction name="insertrecord" access="public" output="false" returntype="void">
    <cfargument name="data" type="struct" required="true">
    <cfquery name="create" datasource="test">
        INSERT INTO logins(
            username,
            password)
        VALUES(
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.username)#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.password)#">
              )
    </cfquery>
</cffunction>

<cffunction name="readRecord" access="public" returntype="query">
    <cfargument name="loginID" type="numeric" required="false" default="0">
        <cfquery name="read" datasource="test">
            SELECT * FROM logins 
            where loginID = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.loginID#">
        </cfquery>
        <cfreturn read/>
</cffunction>
</cfcomponent>
还有你的functions.cfc看起来更像

<cfif !StructIsEmpty(form)>
<cfinvoke component="functions" method="insertrecord">
    <cfinvokeargument name="data" value="#form#">
</cfinvoke>
</cfif>
<cfcomponent output="false">
<cffunction name="insertrecord" access="public" output="false" returntype="void">
    <cfargument name="data" type="struct" required="true">
    <cfquery name="create" datasource="test">
        INSERT INTO logins(
            username,
            password)
        VALUES(
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.username)#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.password)#">
              )
    </cfquery>
</cffunction>

<cffunction name="readRecord" access="public" returntype="query">
    <cfargument name="loginID" type="numeric" required="false" default="0">
        <cfquery name="read" datasource="test">
            SELECT * FROM logins 
            where loginID = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.loginID#">
        </cfquery>
        <cfreturn read/>
</cffunction>
</cfcomponent>
resultsPage.cfm

<cfscript>
  f = createObject('component','functions');
  r= f.readRecord(theIdToPass);
</cfscript>
<table>
<tr>
    <th>LOGIN</th>
    <th>USERNAME</th>
    <th>PASSWORD</th>
</tr>
<cfloop query="r">
<tr>
    <td>#r.login#</td>
    <td>#r.username#</td>
    <td>#r.password#</td>
</tr>
</cfloop>   
</table>
你会发现cfqueryparam不仅有一个小的性能提升,而且可以保护你免受sql攻击,使用它吧!!总是

您还可以考虑为每个expect执行参数,而不是使用结构变量,因为在不知道要传递什么的情况下为结构编写错误捕获可能会非常令人沮丧


希望这能让你在CF上有一个积极的开始

我认为主要的问题是您已经将函数insertrecord插入Application.cfc。虽然这是允许的,但我认为最终会让你困惑。我相信您会遇到这个错误,因为您在cfinvoke调用中引用了应用程序。应用程序在ColdFusion中也恰好是应用程序范围的保留字。只需创建一个包含函数的新.cfc文件,并调用它即可。@Miguel-F好的,那么使用dir中的'functions.cfc',现在使用我的insertrecord函数,CF服务器将同时查找'Application.cfc'和/或它是必需的吗?是的,如果找到了Application.cfc,ColdFusion将自动查找并执行。不仅如此,您还可以在Application.cfc中定义在特定生命周期事件期间触发的特定事件。它非常强大。非常感谢您的深入回复和示例…是的,我认为这将大大有助于我理解CF,而且我一直打算开始使用cfqueryparam,但在线文档往往有很多地方需要改进,或者新手很难真正理解到底发生了什么,因此,也感谢您提供的示例。干杯没问题@BrandonG很高兴这很有帮助。如果您有更改,请将此答案标记为已接受。