提交表单后,我需要检查数据库表中的任何字段是否发生了更改。如果更改,我将创建一个新记录,否则,我不会执行任何操作。我不能就这么更新记录。
有没有办法不像下面的代码那样检查每个字段?
<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>
...
谢谢
发布于 2019-06-11 03:21:23
可能取决于您正在使用的数据库,但是如果数据不存在,您应该能够执行将插入的查询。
例如,我刚刚使用CF2016企业版对Oracle12c进行了测试,如果数据不存在,它会创建一条新记录。
<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>
发布于 2019-06-11 03:08:41
你能对此做进一步的解释吗?如果不能更新记录本身,为什么要允许提交包含更改数据的表单?如果单击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>
我还看到,原始值存储在隐藏的表单域中,并与可编辑的表单域一起提交。您可以这样做,但不能保证在呈现表单和提交表单之间DB中的值没有更改。
在如何判断DB值在访问DB的过程中是否发生了变化方面,您仍然会遇到一些挑战,但我不确定您是否需要这样细粒度的检查。
发布于 2019-06-12 20:10:23
我们可以使用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>
希望,您是在为您的场景询问上面的代码。
https://stackoverflow.com/questions/56531097
复制相似问题