我正在使用通过 REST API 连接到数据库的 HTML 表单。服务器工作由 Coldfusion 处理,主要使用 cfscript 语法。
表单数据以每个表单的两个或多个集合提交。大多数表单都很长,性能要求每组提交约 70 个字段。在创建和更新之间拆分记录还允许通过在初始调用中传递表单响应 ID 并在表单完成后在后续更新中检查它来进行重复检查。
当传入的表单初始化应用程序时,会查询表单响应 ID。如果没有匹配,那么它是一个新的记录。如果匹配,则使用数据库记录 ID 更新记录。我目前在 if 语句中设置了这个逻辑,并且在初始调用中创建了两条记录。我尝试了一些变体来解决这个问题,包括检查其他变量、switch 语句、do/while 循环、嵌套 if 语句等。在每种情况下,都会创建两个记录而不是一个记录。随后的调用会更新两条记录中的最新记录,并且不会创建新记录。
<cfscript>
// Setup the qb object to call add and update methods
qb = new components.qb();
// Setup query object. In this case we're passing Response ID parameters to compare against. This allows us to check whether the incoming request represents a new record or an update.
qbQuery = new components.qbQue().qFieldValue(#qb_tableID#, #qb_token#, #uField#, #uValue#, #uList# );
// An array of returned records, empty if new record
qbRecords = qbQuery.getQbRecords();
// The latest Record ID to edit
qbLatest = qbQuery.getLatestRecord();
writeOutput("qbRecords is #arrayLen(qbRecords)# long! <br>");
if (arrayLen(qbRecords) == 0) {
add_record = qb.addRecord(qb_tableID, qb_token, form_data);
} else {
edit_record = qb.editRecord(qb_tableID, qbLatest, qb_token, form_data_edit);
}
</cfscript>
[编辑] addRecord() 函数
public any function addRecord(qb_tableID, qb_token, form_data)
{
variables.qb_ticket = SESSION.qbTicket
;
http
method = "POST"
result = "qbReturn"
url = "#variables.qbUrl#/#qb_tableID#?act=API_AddRecord&ticket=#variables.qb_ticket#&apptoken=#qb_token#&#form_data#"
;
this.setUuid(CreateUUID());
this.setQbResult(XmlParse(qbReturn.Filecontent));
this.setQbAction(Trim(QbResult.xmlRoot.XmlChildren[1].XmlText));
this.setQbErrCode(Trim(QbResult.xmlRoot.XmlChildren[2].XmlText));
this.setQbErrText(Trim(QbResult.xmlRoot.XmlChildren[3].XmlText));
this.setQbRid(Trim(QbResult.xmlRoot.XmlChildren[4].XmlText));
this.setQbUpdateid(Trim(QbResult.xmlRoot.XmlChildren[5].XmlText))
;
return ( this )
;
}
[编辑] 上面的函数是从下面的 createRecord() 函数重构而来的。在更改中,当前的 addRecord() 函数将数据传递到旧代码提交 XML 的 URL 中的 API。这不应该是问题,但我将其称为显着差异。
另一个显着的区别是 createRecord() 不会创建两条记录。
<cffunction name="createRecord" returntype="any" access="public" output="false" description="Create new record">
<cfargument name="qbURL" type="string" required="true" />
<cfargument name="tableID" type="string" required="true" />
<cfargument name="newRecord" type="xml" required="true" />
<cfargument name="theTicket" type="string" required="true" />
<cfargument name="theToken" type="string" required="true" />
<!--- Add Record --->
<cfhttp url="#qbURL#/#tableID#?" method="post" charset="utf-8" result="addRecord">
<cfhttpparam type="body" value="#newRecord#" />
<cfhttpparam type="Header" name="Content-Type" value="application/xml" />
<cfhttpparam type="Header" name="Accept-Encoding" value="deflate;q=0">
<cfhttpparam type="Header" name="Content-length" value="#len(newRecord)#"/>
<cfhttpparam type="URL" name="act" value="API_AddRecord">
<cfhttpparam type="URL" name="ticket" value="#theTicket#">
<cfhttpparam type="URL" name="apptoken" value="#theToken#">
</cfhttp>
<cfreturn addRecord.Filecontent />
</cffunction>