0

ajax経由で呼び出されるcfc関数があります。マーチャント コード (単一のコードまたはカンマ区切りのコードのリスト) を受け取り、いくつかのチェックと I/O を実行してから、フラグを返します。

注: セキュリティ上の理由から、CFAdmin 設定の「プレフィックス JSON with '//'」を有効にしましたが、これが問題の原因のようです。

フロン機能:

この関数から返される可能性のある値は、文字列 ("qweqweqwe" など) または "1" の 2 つだけです。

無効な文字列が検出されると、ループ内で文字列が返されますmerchant_code。プロセス全体が成功したことを示すために、ループの後に「1」が返されます。

<cffunction name="createCategoryMerchant" access="remote" returntype="any" returnFormat="JSON">
    <cfargument name="category_id" required="true" type="numeric"/>
    <cfargument name="merchant_code" required="true" type="any" default="" hint="expect list of merchant codes"/>
    <cfset var qChk = 0 />
    <cfset var qIns = 0 />
    <cfset var vItem = "">
    
    <cfloop list="#arguments.merchant_code#" index="item">
        
        <!--- does merchant exist? --->
        <cfquery name="qChk" datasource="#DSN#"> 
            select id from merchant
            where merchant_num = <cfqueryparam value="#item#" cfsqltype="cf_sql_varchar" />
        </cfquery>

        <cfif not qChk.recordcount>
            <cfreturn merchant_code> <!--- return bad code, e.g. "qweqweqwe" --->
            <cfbreak>
        </cfif>

        <!--- Has the merchant already been assigned to this category? --->
        <cfquery name="qChk" datasource="#DSN#"> 
            select unique_id 
            from category_merchant
            where category_id = <cfqueryparam value="#arguments.category_id#" cfsqltype="cf_sql_integer" />
            and merchant_code = <cfqueryparam value="#item#" cfsqltype="cf_sql_varchar" />
        </cfquery>

        <cfif qChk.recordcount>
            <cfcontinue> <!--- silently accept and bail out, even though already exists --->
        </cfif>
        
        <!--- insert record if code is legit --->
        <cfquery name="qIns" datasource="#DSN#"> 
            insert into category_merchant (category_id, merchant_code)
            values (
                <cfqueryparam value="#arguments.category_id#" cfsqltype="cf_sql_integer" />,
                <cfqueryparam value="#UCASE(item)#" cfsqltype="cf_sql_varchar" />
                )
        </cfquery>

    </cfloop>
    <cfreturn 1>
</cffunction>

AJAX:

以下のコードには、私が試した 2 つの異なる ajax 呼び出しオプションが含まれており、コード コメントに記載されているように、それぞれが異なる結果を生成します。

$('.btnAddMerchant').on('click',function(e){
    
    var clickedID = $(this).attr("id");
    var category_id = clickedID.split("_")[1];
    var merchant_code = $('#merchant_code').val();
    merchant_code = merchant_code.replace(/\s/g,'');
    $('.res').empty().hide;

    if(merchant_code.length == 0){
        $('#resAdd').show().html('Enter merchant code');
    }else{

        // OPTION 1: Note I have used "dataFilter" to handle the "//" prefixed JSON

        $.ajax({
              type:"POST",
              url: '/system.cfc?method=createCategoryMerchant',
              data: {category_id:category_id,merchant_code:merchant_code},
              dataFilter: function(data, type) {return data.substr(2)},
              dataType: 'json',
              cache:false,
              success: function(res) {
                  alert(res);  // This only fires for INVALID codes, i.e. if the cfc returns a string such as "qweqweqwe". Doesn't fire for a single numeric return, e.g. "1"                
              }
         });
        
        // OPTION  2:           

        $.getJSON("/system.cfc?method=createCategoryMerchant&returnformat=json",{"category_id":category_id,"merchant_code":merchant_code},function(res,code){
            alert(res); // This only fires if the code is VALID, i.e. the CFC returns "1". It does not fire if the invalid code "qweqweqwe" is returned
        });
                    
    }
});

注: 無効なコードのみが "//" プレフィックスで返されます。「1」が返される場合、これは前に付けられません。

ここに画像の説明を入力

CFAdmin 設定の「プレフィックス JSON に '//' を付ける」を無効にすると、すべての問題がなくなります。上記のajaxオプション1を使用したいと思いますが、有効なデータに対して返されたフラグ「1」の処理に明らかに失敗した理由を知る必要があります。

編集

問題は、単純に、オプション 1 の dataFilter 属性が「//」で始まる戻り値を処理していないことにある可能性があります。それでは、「qweqweqw」にはプレフィックスがあるのに、「//」プレフィックスで「1」が返されないのはなぜですか?

4

1 に答える 1

1

私はこれを使用して解決しました:

<cfreturn serializeJSON(1)>

これは手動で「//」プレフィックスを「1」に追加するようです。そもそもなぜ欠席したのかわからない。

于 2020-09-02T00:20:09.567 に答える