检查是否有任何字段与数据库值不同



提交表单后,我需要检查数据库表中是否有任何字段更改。如果更改,我会创建一个新记录,如果没有,我什么都不做。我不能只是更新记录。

有没有办法在不检查每个字段的情况下做到这一点,就像下面的代码一样?

<cfquery name="getData" datasource="myDS">
Select * From table Where ID = #form.ID#
</cfquery>
<Cfset changed = false />
<!-- Check every field -->
<cfif form.data1 neq getData.data1>
<cfset changed = true />
</cfif>
<cfif form.data2 neq getData.data2>
<cfset changed = true />
</cfif>
<cfif form.data3 neq getData.data3>
<cfset changed = true />
</cfif>
...

谢谢

可能取决于您使用的数据库,但您应该能够执行一个查询,如果数据不存在,该查询将插入。

例如,我刚刚使用 CF12 Enterprise 针对 Oracle 2016c 对此进行了测试,如果数据不存在,它会创建一个新记录。

<cfquery name="Testing" datasource="Test">
INSERT INTO TESTTABLE (DATA1, DATA2, DATA3)
SELECT  <cfqueryparam value="#Form.Data1#" cfsqltype="CF_SQL_VARCHAR" />, <cfqueryparam value="#Form.Data2#" cfsqltype="CF_SQL_VARCHAR" />, <cfqueryparam value="#Form.Data3#" cfsqltype="CF_SQL_VARCHAR" />
FROM dual
WHERE NOT EXISTS 
(SELECT DATA1, DATA2, DATA3 FROM TESTTABLE WHERE DATA1 = <cfqueryparam value="#Form.Data1#" cfsqltype="CF_SQL_VARCHAR" />, 
AND DATA2 = <cfqueryparam value="#Form.Data2#" cfsqltype="CF_SQL_VARCHAR" /> AND DATA3 = <cfqueryparam value="#Form.Data3#" cfsqltype="CF_SQL_VARCHAR" />)
</cfquery>

你能进一步解释一下吗?如果无法更新记录本身,为什么允许提交包含已更改数据的表单?如果单击Save,则将表单数据与查询数据进行比较,并在数据不同时让操作调用Create函数。

假设您有一个事物查询和表单:

<cfquery name="myThing">
SELECT 
thing_id,
thing_name,
thing_foo
FROM 
things 
where 
thingID = <cfqueryparam value="#url.thingID#">
</cfquery>
<form> 
<input type="hidden" name="thing_id" value="#myThing.thing_id#">
<input type="text" name="thing_name" value="#myThing.thing_name#">
<input type="text" name="thing_foo" value="#myThing.thing_foo#">
<button type="submit">Submit</button>
</form>

如果需要根据数据库中已有的数据检查提交的数据,只需在表单处理页面上再次运行查询,并将这些值与提交的表单值进行比较。此示例假定您命名的表单域与数据库表列的名称相同。

<cfset delta = false>
<cfloop item="key" collection="#myThing#">
<cfif structKeyExists(form, key)>
<cfif form[key] NEQ myThing[key]>
<cfset delta = true>
</cfif>
</cfif>
</cfloop>

如果任何值不同,则创建新记录。不知道当提交的值没有更改时需要做什么。

<cfif delta>
<!--- Create a new record. --->
<cfelse>
<!--- ¯_(ツ)_/¯ --->
</cfif>

我还看到它完成了原始值存储在隐藏表单字段中并与可编辑表单字段一起提交的地方。您可以这样做,但不能保证在呈现表单和提交表单之间数据库中的值没有更改。

您仍然会面临一些挑战,即如何判断数据库值在通往数据库的途中是否发生了变化,但我不确定您是否需要如此精细的检查。

我们可以使用 cfquery 来检查表是否具有现有数据。如果没有相同的数据意味着我们可以插入表单。以下代码可能与你的方案相关。

<cfif structKeyExists(form,"Submit")>
<cfquery name="checkFormExisting" datasource="myDSN">
SELECT * 
FROM USERS 
WHERE data1  = <cfqueryparam value="#form.data1#" cfsqltype="cf_sql_varchar">
OR data2 = <cfqueryparam value="#form.data2#" cfsqltype="cf_sql_varchar">
OR data3 = <cfqueryparam value="#form.data3#" cfsqltype="cf_sql_varchar">
</cfquery>
<cfif checkFormExisting.recordCount EQ 0>
INSERT INTO 
USERS (
data1,data2,data3
) 
VALUES (
<cfqueryparam value="#form.data1#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#form.data2#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#form.data3#" cfsqltype="cf_sql_varchar">
)
</cfif>
</cfif>

希望您像上面的代码一样询问您的场景。

相关内容

  • 没有找到相关文章

最新更新