0

クラスIDのクローンを#FORM.classid#数回作成する必要がありますが、必要になるたびにINSERT sqlクエリを作成する代わりに、一度だけ作成してそのaddClass名前でクエリを呼び出す解決策はありますか?関数のコーディング方法を知りたいのですが、CFMLプログラミングの初心者です。

<cfquery name="currentClass" datasource="#dsn#">
        SELECT class_name, class_description
        FROM classes
        WHERE classid = <cfqueryparam value="#FORM.classid#" cfsqltype="cf_sql_numeric"> 
</cfquery>
<cfquery name="addClass" datasource="#dsn#">   
        INSERT INTO classes (class_name,class_description)
        VALUES ('#currentClass.class_name#', '#currentClass.class_description#')
</cfquery>
<cfquery name="getNewID" datasource="#dsn#">
        Select LAST_INSERT_ID() as classid
</cfquery>
4

2 に答える 2

4

作業を行う関数を作成し、その関数を呼び出します。これは、ColdFusion 内で関数を作成する場合に関数を実行する方法です。ただし、実行しているクエリの量を単純化して最終目標を達成することはできますが、既に行っていることを介してこれを書きました:

<cffunction name="AddTheClass" access="public" returntype="numeric">
    <cfargument name="ClassID" required="true" type="numeric" />

    <cfscript>
        var currentClass    = "";
        var addClass        = "";
        var getNewID        = "";

        var myResult        = 0;
    </cfscript>

    <cfquery name="currentClass" datasource="#dsn#">
        SELECT class_name, class_description
        FROM classes
        WHERE classid = <cfqueryparam value="#Arguments.classid#" cfsqltype="cf_sql_numeric"> 
    </cfquery>
    <cfquery name="addClass" datasource="#dsn#">   
        INSERT INTO classes (class_name,class_description)
        VALUES ('#currentClass.class_name#', '#currentClass.class_description#')
    </cfquery>
    <cfquery name="getNewID" datasource="#dsn#">
        Select LAST_INSERT_ID() as classid
        </cfquery>

    <cfset myResult = getNewID.classid />

    <cfreturn myResult />
</cffunction>

<!--- How to call it --->
<cfset intNewClassID    = AddTheClass(ClassID=Form.classid) />

編集: データソース変数を調整する必要がある場合があります。種類は、その変数のスコープを設定していないため、どこから来たのかに依存し、わかりにくいです。

于 2012-06-13T17:26:08.347 に答える
3

これを行う1つの方法を次に示します。ドキュメントの関数を読むことも良いスタートになるでしょう。http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f5c.html

<cffunction name='addClass' returntype='numeric'>
    <cfargument name='ClassID' type='numeric' required='yes' />
    <cfargument name='DSN' type='string' required='yes' />

    <cfset var currentClass = '' />
    <cfset var addClass = '' />
    <cfset var getNewID = '' />

    <cfquery name="currentClass" datasource="#Arguments.dsn#">
    SELECT class_name, class_description
    FROM classes
    WHERE classid = <cfqueryparam value="#Arguments.classid#" cfsqltype="cf_sql_numeric"> 
    </cfquery>
    <cfquery name="addClass" datasource="#Arguments.dsn#">   
    INSERT INTO classes (class_name,class_description)
    VALUES ('#currentClass.class_name#', '#currentClass.class_description#')
    </cfquery>
    <cfquery name="getNewID" datasource="#Arguments.dsn#">
    Select LAST_INSERT_ID() as classid
    </cfquery>
    <cfreturn getNewID.ClassID />
</cffunction>

また、最後のクエリをそれに置き換えることができる可能性があるため、cfquery タグで結果属性を使用することも検討する必要があります。http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7fae.html

結果メソッドを利用できない場合は、2 つのクエリ間で競合状態が発生しないようにするために利用します。

[e] 関数のスコープ外の変数を参照してはならないため、引数に DSN を追加したことに気付くでしょう。[e2] cfquery では cfqueryparam タグも使用する必要がありますが、その部分は更新させていただきます。

于 2012-06-13T17:34:37.963 に答える