Функция ColdFusion возвращает ошибку «Система пыталась использовать неопределенное значение»? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть функция, которая должна сохранять некоторые поля формы.Эта функция может обрабатывать несколько строк вставки.До сих пор мне удавалось создать логику, чтобы справиться с этим, но единственная проблема, которая у меня возникла, когда пользователь пытается сохранить запись.Ответ сервера выглядит следующим образом:

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"});

Я проверил базу данных и записи там.Никаких подробностей об этой ошибке ничего нет.По крайней мере, я не получаю сообщение об ошибке, которое я описал в приведенном выше вопросе, но до сих пор не знаю, что вызывает мой код сбоя.

1 Ответ

0 голосов
/ 21 февраля 2019

Я нашел две вещи 1) вставляемый вами запрос не имеет никакого значения.INSERT INTO имя таблицы (столбцы ...) ЗНАЧЕНИЯ (значения столбца ..) Но вы пропустили ключевое слово VALUE в своем запросе.2) Всякий раз, когда вы собираетесь выполнить две операции запроса в одном теге cfquery, вы должны добавить некоторую строку соединения в свои источники данных testDB.Который доступен в административной части CFML.Откройте свой источник данных и установите следующие параметры.В администрировании CFML: enter image description here

Если вы используете Lucee, значит: Пожалуйста, проверьте следующие параметры в вашем источнике данных, который доступен в lucee server / web admin,

enter image description here

...