1

それで、私はインライン (正しい用語ですか?) ColdFusion コードを使用してすべてのページを実行してきましたが、基本を十分に理解し、次のステップに進みたいと思うところまで来ました。多くの相互参照、調査、および試行錯誤の後、フォーム ページ (crud.cfm) にユーザー名とパスワードを入力できるようにすることを目的とした次の 4 つのページを思いつきました。 、送信後、新しく入力されたデータと過去のエントリを表示するページにユーザーをリダイレクトします。

シンプルなインライン コードと Application.CFM を使用してこれらすべてを行うことができますが、現在、いくつかの異なるページにまたがってコードのスキャドを書き直したりコピーして貼り付けたりしていることに気付いているため、今後はより OOP/モジュラーなアプローチに移行したいと考えています。「crud.cfm」から送信したときに表示されるエラーは次のとおりです。

「cfinvoke タグのコンポーネント属性に無効な値があります。」

ハッシュなしで、大文字の「A」なしで試してみましたが、役に立ちませんでした。ここに私の非動作コードがあります:

アプリケーション.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">

結果ページ.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 データベース。ご協力いただきありがとうございます。ご回答をお待ちしております。

4

2 に答える 2

2

Application.cfc は、ColdFusion の特別なファイルです。

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=AppEvents_01.html

コンポーネントに別の名前を付ける必要があります。Application.cfc は、アプリケーション イベント、セットアップ コードなどを配置する場所です。

于 2013-03-04T21:44:23.207 に答える
1

ミゲルへの質問への回答として、はい。application.cfc は、cfm が呼び出されるたびに呼び出されます。したがって、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で前向きなスタートを切ることができます!

于 2013-03-05T03:09:42.860 に答える