首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查是否有字段与数据库值不同

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

Stack Overflow用户
提问于 2019-06-11 01:42:40
回答 3查看 581关注 0票数 1

提交表单后,我需要检查数据库表中的任何字段是否发生了更改。如果更改,我将创建一个新记录,否则,我不会执行任何操作。我不能就这么更新记录。

有没有办法不像下面的代码那样检查每个字段?

代码语言:javascript
复制
<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>
...

谢谢

EN

回答 3

Stack Overflow用户

发布于 2019-06-11 03:21:23

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

例如,我刚刚使用CF2016企业版对Oracle12c进行了测试,如果数据不存在,它会创建一条新记录。

代码语言:javascript
复制
<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>
票数 3
EN

Stack Overflow用户

发布于 2019-06-11 03:08:41

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

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

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<cfset delta = false>
<cfloop item="key" collection="#myThing#">
    <cfif structKeyExists(form, key)>
        <cfif form[key] NEQ myThing[key]>
            <cfset delta = true>
        </cfif>
    </cfif>
</cfloop>

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

代码语言:javascript
复制
<cfif delta>
    <!--- Create a new record. --->
<cfelse>
    <!--- ¯\_(ツ)_/¯ --->
</cfif>

我还看到,原始值存储在隐藏的表单域中,并与可编辑的表单域一起提交。您可以这样做,但不能保证在呈现表单和提交表单之间DB中的值没有更改。

在如何判断DB值在访问DB的过程中是否发生了变化方面,您仍然会遇到一些挑战,但我不确定您是否需要这样细粒度的检查。

票数 1
EN

Stack Overflow用户

发布于 2019-06-12 20:10:23

我们可以使用cfquery来检查表中是否包含现有数据。如果没有相同的数据,我们可以插入表单。以下代码可能与您的场景相关。

代码语言:javascript
复制
<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>

希望,您是在为您的场景询问上面的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56531097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档