2013-03-04 13 views
1

所以我一直在使用內聯(正確的術語?)ColdFusion代碼來運行我所有的頁面,並且已經到了一個點,我認爲我對基礎知識有一個正確的理解,並且想要採取下一步。經過大量的交叉引用,研究和反覆試驗後,我想出了以下4個頁面,其中的意圖是能夠在頁面(crud.cfm)中輸入用戶名和密碼,然後在提交後,將用戶重定向到顯示新輸入數據的頁面以及任何過去的條目。新手,非常基本的CRUD通過Application.cfc

我可以用簡單的在線代碼和Application.CFM完成所有這些工作,但我希望今後可以向更多的OOP /模塊化方法遷移,因爲目前我發現自己在整個代碼中重寫/複製粘貼代碼塊幾個不同的頁面。我從'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> 

crud.cfm

<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數據庫。 非常感謝大家的幫助,期待您的回覆!

+1

我認爲主要問題是您已經將函數「insertrecord」插入到Application.cfc中。雖然這是允許的,但我認爲它最終會讓你感到困惑。我相信你會得到那個錯誤,因爲你在'cfinvoke'調用中引用了「#Application#」。 'Application'也恰好是ColdFusion中應用程序範圍的保留字。只需用你的函數創建一個新的.cfc文件,然後調用它。 – 2013-03-04 21:19:41

+0

@ Miguel-F好了,那麼在dir(現在持有我的insertrecord函數)中使用'functions.cfc',CF服務器是否也會查找'Application.cfc'和/或它是否需要? – 2013-03-04 22:11:18

+0

是的,ColdFusion會自動查找並執行(如果找到)Application.cfc。不僅如此,還有特定的事件可以在Application.cfc中定義,在特定的生命週期事件中觸發。它非常強大。 [請在此處閱讀更多內容](http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=AppEvents_01.html) – 2013-03-05 13:23:51

回答

1

回答你對米格爾的問題,是的。每次調用cfm時都會調用application.cfc。所以當你點擊crud.cfm時,application.cfc就會運行。當你打procpage.cfm的Application.cfc運行等。

所以你希望你的procpage.cfm看起來更像

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

和你functions.cfc看起來更像

<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攻擊等,使用它!總是。

你也可能會考慮爲每個人做參數而不是使用結構變量,因爲寫入結構的錯誤陷阱而不知道你期望被傳遞的結果會非常令人沮喪。

希望這可以讓你的CF正面開始!

+0

非常感謝您的深入響應和示例...是的,我認爲這將對我對CF的理解有很長的路要走,並且我也有意開始使用cfqueryparam,但在線文檔通常會有很多不足之處,或者很難讓新手真正理解到底發生了什麼,所以也要感謝你的例子。乾杯! :) – 2013-03-07 20:14:38

+0

沒問題@BrandonG很高興有幫助。如果您有任何改變,您可以將此答案標記爲已接受。 – Lance 2013-03-07 21:32:52