当您在地址页上时,可以使用查询填充该页。
您需要某种id来验证要编辑的记录。我假设将根据某种会话标识符输入装运记录。
我的理论数据库设置:
帐单地址
| ID | Address1 | etc... |
===============================
| 1 | 123 Sesame St | ...... |
发货地址
===============================
|芝麻街123号|
在初始表单上,我们可以查询数据库以查看是否有用户的记录。
<cfquery name="getShippingAddress" datasource="myDSN">
SELECT TOP 1 ID, Address1, etc...
FROM ShippingAddress
WHERE ID = <cfqueryparam value="#session.ID#" cfsqltype="cf_sql_integer">
</cfquery>
<cfquery name="getBillingDetails" datasource="myDSN">
SELECT TOP 1 ID, Address1, etc...
FROM BillingAddress
WHERE ID = <cfqueryparam value="#session.ID#" cfsqltype="cf_sql_integer">
</cfquery>
注:如果我们可以保证一个项目不会超过一行
ID
,那么我们可以跳过
TOP 1
当我们写出表单时,我们可以将现有的值输出到表单中。
<cfoutput>
<input type="text" name="shippingAddress1"
value="#encodeForHTMLAttribute(getShippingAddress.Address1)#" />
</cfoutput>
在表单中,有一个复选框(
BillingShippingSame
)以确定帐单地址是否与装运地址相同。
<cfif BillingShippingSame = getShippingAddress.Address1 = getBillingAddress.Address1 AND .... >
这只是说如果两个查询中的地址字段相同,那么设置
帐单发货名称
true
否则
false
. 如果两个查询中的所有字段都相同,还可以将两个查询转换为JSON并进行比较(
serializeJSON(getShippingAddress) == serializeJSON(getBillinAddress)
). 如果您有多个需要检查的字段,这将节省一些输入,但是只有当两个查询中的字段相同时,它们才会序列化相同的字段。然后在复选框输入中设置值。
<input type="text" name="BillingShippingSame" <cfif BillingShippingSame>checked="checked"</cfif> />
如果你想的话,你可以用javascript写这个页面
帐单发货名称
form
查看是否选中了该框。如果是,则将Billing details设置为Shipping details。
插入/更新查询:
<cfset cleanShippingAddress1 = cleanString(form.ShippingAddress)>
<cfif structKeyExists(form,"BillingShippingSame")>
<cfset cleanBillingAddress1 = cleanString(form.ShippingAddress)>
<cfset cleanOtherBillingFields = .....>
<cfelse>
<cfset cleanBillingAddress1 = cleanString(form.BillingAddress)>
<cfset cleanOtherBillingFields = .....>
</cfif>
<cfset cleanOtherFields = cleanString(....)>
<cfquery name="UpsertShippingAddress" datasource="myDSN">
UPDATE ShippingAddress
SET ShippingAddress1 = <cfqueryparam value="#cleanShippingAddress1#" cfsqltype="cf_sql_varchar">
, OtherShippingFields =
<cfqueryparam value="#cleanOtherShippingFields#" cfsqltype="cf_sql_varchar">
, ...
WHERE ID = <cfqueryparam value="#session.ID#" cfsqltype="cf_sql_integer">
IF @@ROWCOUNT=0
INSERT INTO ShippingAddress ( ID, ShippingAddress1, OtherShippingFields, ....)
VALUES (
<cfqueryparam value="#session.ID#" cfsqltype="cf_sql_integer">
, <cfqueryparam value="#cleanShippingAddress1#" cfsqltype="cf_sql_varchar">
, <cfqueryparam value="#cleanOtherShippingFields#" cfsqltype="cf_sql_varchar">
, ...
) ;
</cfquery>
<cfquery name="UpsertBillingAddress" datasource="myDSN">
UPDATE BillingAddress
SET BillingAddress1 = <cfqueryparam value="#cleanBillingAddress1#" cfsqltype="cf_sql_varchar">
, OtherShippingFields =
<cfqueryparam value="#cleanOtherBillingFields#" cfsqltype="cf_sql_varchar">
, ...
WHERE ID = <cfqueryparam value="#session.ID#" cfsqltype="cf_sql_integer">
IF @@ROWCOUNT=0
INSERT INTO BillingAddress ( ID, BillingAddress1, OtherBillingFields, ....)
VALUES (
<cfqueryparam value="#session.ID#" cfsqltype="cf_sql_integer">
, <cfqueryparam value="#cleanBillingAddress1#" cfsqltype="cf_sql_varchar">
, cfqueryparam value="#cleanOtherBillingFields#" cfsqltype="cf_sql_varchar">
, ...
) ;
</cfquery>
形式
或
url
或其他不可信的输入。我的
cleanString
函数将在字符串进入数据库之前对其进行各种清理。
UPDATE
如果没有插入行(
@@ROWCOUNT=0
&燃气轮机&燃气轮机;没有找到身份证),那么它会的
INSERT