【问题标题】:ColdFusion function returns an error "The system has attempted to use an undefined value"?ColdFusion 函数返回错误“系统已尝试使用未定义的值”?
【发布时间】:2019-07-14 15:12:44
【问题描述】:

我有可以保存一些表单字段的功能。此函数能够处理多个插入行。到目前为止,我能够创建逻辑来处理这个问题,但到目前为止我唯一遇到的问题是用户尝试保存记录。服务器响应如下所示:

The system has attempted to use an undefined value, which usually indicates a programming error, either in your code or some system code. Null Pointers are another name for undefined values. coldfusion

起初我正在寻找并试图找出我的函数中未定义/丢失的值,但到目前为止我无法检测到问题。我做的下一件事是注释掉cfquery。之后我收到了消息Form successfully saved.。这告诉我我的代码在cfquery 标记内部被破坏。这是我的代码示例:

<cffunction name="saveRecords" access="remote" output="false" returnformat="JSON">
    <cfargument name="formID" type="string" required="true" default="">
    <cfargument name="status1" type="string" required="true" default="0">
    <cfargument name="status2" type="string" required="true" default="0">
    <cfargument name="status3" type="string" required="true" default="0">
    <cfargument name="status4" type="string" required="true" default="0">
    <cfargument name="status5" type="string" required="true" default="0">
    <cfargument name="comment1" type="string" required="true" default="">
    <cfargument name="comment2" type="string" required="true" default="">
    <cfargument name="comment3" type="string" required="true" default="">
    <cfargument name="comment4" type="string" required="true" default="">
    <cfargument name="comment5" type="string" required="true" default="">

    <cfset local.fnResults = structNew() />
    <cfset local.runProcess = true />
    <cfset local.arrStatus = arrayNew(1) />

    <cfloop collection="#arguments#" item="i">
        <cfif findNoCase(left(i,6), "status") and arguments[i] eq 1>
            <cfset arrayAppend(local.arrStatus, right(i,1)) />
        </cfif>
    </cfloop>

    <cfset local.frmValidation = {
        formID : len(arguments.formID),
        status1 : ArrayContains([0,1], trim(arguments.status1)),
        status2 : ArrayContains([0,1], trim(arguments.status2)),
        status3 : ArrayContains([0,1], trim(arguments.status3)),
        status4 : ArrayContains([0,1], trim(arguments.status4)),
        status5 : ArrayContains([0,1], trim(arguments.status5))
    }/>

    <cfloop collection="#frmValidation#" item="i">
        <cfif !frmValidation[i] or !arrayLen(arrStatus)>
            <cfset local.runProcess = false />
            <cfset local.fnResults = {status: 400, message: "Form data is either missing or incorrect."}>
            <cfbreak>
        </cfif>
    </cfloop>

    <cfif runProcess>
        <!---
        <cfquery name="saveRec" datasource="testDB">
            <cfloop array="#arrStatus#" index="i">
                INSERT INTO formDetails (
                    formid,
                    refid,
                    status,
                    comment,
                    userid,
                    lastupdate
                )
                SELECT
                    <cfqueryparam cfsqltype="cf_sql_numeric" value="#trim(arguments.formID)#">,
                    #i#,
                    <cfqueryparam cfsqltype="cf_sql_bit" value="#trim(arguments["status"&i])#">,
                    <cfqueryparam cfsqltype="cf_sql_varchar" maxlength="8000" value="#trim(arguments["comment"&i])#" null="#!len(trim(arguments["comment"&i]))#">,
                    <cfqueryparam cfsqltype="cf_sql_varchar" maxlength="6" value="#trim(session.userid)#" null="#!len(trim(session.userid))#">,
                    #now()#
                WHERE NOT EXISTS (
                    SELECT refid
                    FROM formDetails
                    WHERE formid = <cfqueryparam cfsqltype="cf_sql_numeric" value="#trim(arguments.formID)#">
                        AND refid = #i#
                )
            </cfloop>
        </cfquery>
        --->
        <cfset local.fnResults = {status: 200, message: "Form successfully saved!"}>
    </cfif>

    <cfreturn fnResults>
</cffunction>

我忘了提一件事,在我注释掉 cfquery 之前,我尝试保存记录,但会出现我上面提到的错误,但同时记录保存在数据库中。这很奇怪,因为我没想到查询会因为错误而成功执行。我使用 Sybase 数据库,这里是关于 formDetails 表的详细信息:

column name    data type   length
recid          numeric      18      PK
formid         numeric      10      FK
refid          numeric      18      FK
status         bit          1
comment        varchar      8000
userid         varchar      6
lastupdate     datetime     23

我不确定我的代码在哪里出错以及为什么我会收到关于 undefined value 的错误消息。如果有人可以帮助或提供有关如何解决此问题的有用资源,请告诉我。

更新

我一直在寻找有关如何解决此问题的解决方案,并尝试将 cfscript 与 UNION ALL 一起使用。这是少数人建议的,这是我的代码示例:

remote function saveRecords(required string formID, string status1="0", string status2="0", string status3="0", string status4="0", string status5="0", string comment1="", string comment2="", string comment3="", string comment4="", string comment5="") output=false returnFormat="JSON" {
        local.fnResults = structNew();
        local.runProcess = true;
        local.arrReference = arrayNew(1);

        try {
            local.frmValidation = {
                formID : len(arguments.formID),
                status1 : ArrayContains([0,1], arguments.status1),
                status2 : ArrayContains([0,1], arguments.status2),
                status3 : ArrayContains([0,1], arguments.status3),
                status4 : ArrayContains([0,1], arguments.status4),
                status5 : ArrayContains([0,1], arguments.status5)
            };

            for ( i in frmValidation ) {
                if ( !frmValidation[i] ) {
                    local.runProcess = false;
                    local.fnResults = {status: 400, message: "Form data is either missing or incorrect."};
                    break;
                }
            }

            for ( fld in arguments ) {
                if ( findNoCase(left(fld,6), "status") && arguments[fld] == 1 ) {
                    arrayAppend(arrReference, right(fld,1));
                }
            }

            if ( runProcess ) {
                local.qrySql = "INSERT INTO formDetails(recid, formid, refid, status, comment, userid, lastupdate)";
                local.qryParams = [];

                for ( idx=1 ; idx<=arraylen(arrReference) ; idx++ ) {
                    local.referenceID = arrReference[idx];
                    local.recPK = trim(arguments.formID) & trim(referenceID);
                    local.statusVal = trim(arguments["status" & local.referenceID]);
                    local.commentVal = trim(arguments["comment" & local.referenceID]);

                    if ( idx != 1 ) {
                        local.qrySql &= " UNION ALL ";
                    }

                    local.qrySql &= " SELECT ?,?,?,?,?,?,?";
                    qryParams.append({cfsqltype="cf_sql_numeric", value=local.recPK});
                    qryParams.append({cfsqltype="cf_sql_numeric", value=trim(arguments.formID)});
                    qryParams.append({cfsqltype="cf_sql_numeric", value=local.referenceID});
                    qryParams.append({cfsqltype="cf_sql_tinyint", value=local.statusVal});
                    qryParams.append({cfsqltype="cf_sql_varchar", value=local.commentVal, maxlength=8000, null=!len(local.commentVal)});
                    qryParams.append({cfsqltype="cf_sql_varchar", value=trim(session.userid), maxlength=6, null=!len(trim(session.userid))});
                    qryParams.append({cfsqltype="cf_sql_timestamp", value=now()});
                }

                local.qryResult = queryExecute(qrySQL, qryParams, {datasource="#application.datasource#", result="insertRecords"});

                local.fnResults = {result: insertRecords, sql: qrySql, params: qryParams, array: arrReference, args: arguments, status: 200, message: "Form successfully saved!"};
            }
        } catch (any e) {
            local.fnResults = {sql: qrySql, params: qryParams, error: e, status: 400, message: "Error! Something went wrong..."};
        }

        return fnResults;
    }

在我尝试保存记录后,我收到了消息Something went wrong...。我查看了响应,我只能看到指向这一行的错误:

local.qryResult = queryExecute(qrySQL, qryParams, {datasource="#application.datasource#", result="insertRecords"});

我检查了数据库,记录在那里。没有关于此错误的详细信息。至少我没有收到我在上面的问题中描述的错误,但仍然不知道是什么导致我的代码崩溃。

【问题讨论】:

  • 评论不用于扩展讨论;这个对话是moved to chat
  • 我确实找到了我的代码无法正常工作的问题。我删除了代码中的所有cfqueryparams,一切正常。所以 Sybase 数据库支持的 cfsql_types 有问题。我对sybase和这个问题了解不多。如果有人有任何文章或建议,请告诉我。

标签: coldfusion sybase coldfusion-11 cfquery


【解决方案1】:

我发现了两件事 1)您插入的查询没有任何价值。 INSERT INTO tablename( columns ... ) VALUES ( column values.. ) 但是您在查询中错过了 VALUE 关键字。 2) 每当您要在单个 cfquery 标记中执行两个查询操作时,您应该在 testDB 数据源中添加一些连接字符串。这在 CFML 管理部分中可用。打开您的数据源并设置以下选项。在 CFML 管理员中:

如果您使用的是 Lucee,则意味着:请检查您的数据源中的以下选项,这些选项在 lucee 服务器/网络管理员中可用,

【讨论】:

  • 我不确定这是否正确,因为我使用的是 Sybase 数据库。在此链接中,您可以找到有关多行插入正确语法的示例:stackoverflow.com/questions/24635327/… 我的示例中的 sql 代码有效且有效,因为我测试了多次。即使我的代码产生了我解释的错误,记录被插入到数据库中。唯一的问题是我的代码返回错误,但在我的代码中找不到问题。
  • 嗯!我在这里的意思是,据我所知,如果您使用两个查询,这意味着您正在使用 INSERT & SELECT 与相同的 cfquery 标记。所以我建议那样做。让我再想想你的代码有什么问题。我可以知道 VALUES 吗?您在 INSERT 查询中错过了这一点。
  • 如果您是INSERT....SELECT,则您的INSERT 中不需要VALUESELECT 语句替换了 VALUE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2019-12-15
  • 2020-04-10
  • 2019-11-18
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多