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

时间:2019-06-10 17:42:40

标签: coldfusion cfc cfquery

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

有没有一种方法可以像不检查下面的代码那样检查每个字段?

<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>
...

谢谢

3 个答案:

答案 0 :(得分:3)

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

作为示例,我刚刚使用CF2016 Enterprise在Oracle 12c上对此进行了测试,如果数据不存在,它将创建一条新记录。

<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>

答案 1 :(得分:1)

您能进一步解释一下吗?如果您无法更新记录本身,为什么要允许表单提交更改后的数据?如果单击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>

我还看到将原始值存储在隐藏的表单字段中并与可编辑的表单字段一起提交的情况。您可以执行此操作,但是不能保证在渲染表单和提交表单之间数据库中的值没有更改。

在如何判断数据库值是否已更改到数据库的方式上,您仍然会遇到一些挑战,但是我不确定是否需要如此细致的检查。

答案 2 :(得分:0)

我们可以使用cfquery来检查具有现有数据的表。如果没有相同的数据,则可以插入表格。以下代码可能与您的情况有关。

/tmp

希望,您的要求像上面的代码一样。