Когда вы находитесь на своей странице адреса, вы можете использовать запрос для заполнения страницы.
Вам понадобится какой-то идентификатор для подтверждения записи, которую вы хотите редактировать.Я предполагаю, что запись об отправке будет введена на основе какого-либо идентификатора сеанса.
Моя теоретическая настройка базы данных:
BillingAddress
| ID | Address1 | etc... |
===============================
| 1 | 123 Sesame St | ...... |
ShippingAddress
| ID | Address1 | etc... |
===============================
| 1 | 123 Sesame St | ...... |
ВклИсходная форма, мы можем запросить базу данных, чтобы увидеть, есть ли какие-либо записи для пользователя.
<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 .... >
Это просто говорит о том, что если поля Address в обоих запросах одинаковы, тогда установите BillingShippingSame
в true
в противном случае false
.Если все поля в обоих запросах одинаковы, вы также можете преобразовать оба запроса в JSON и сравнить их.(serializeJSON(getShippingAddress) == serializeJSON(getBillinAddress)
).Это сохранит некоторую типизацию, если у вас есть несколько полей, которые необходимо проверить, но они будут сериализованы одинаково, только если поля в обоих запросах одинаковы.Затем просто установите значение в поле ввода флажка.
<input type="text" name="BillingShippingSame" <cfif BillingShippingSame>checked="checked"</cfif> />
И если вы хотите, вы можете сделать javascript на странице так, чтобы, если отмечен BillingShippingSame
, он либо отключил поля формы Billing, либо просто продолжилзаполнить их тем, что было возвращено из базы данных.
Вернуться к нашему рабочему процессу.Поскольку HTML не пропустит флажок, если он не установлен, просто посмотрите в область действия form
, чтобы увидеть, установлен ли этот флажок.Если это так, то установите для платежных реквизитов сведения о доставке.
Запросы на вставку / обновление:
<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>
Я склонен ошибаться из-за паранойи, когда дело доходит до form
или url
или другие ненадежные входы.Моя функция cleanString
будет выполнять различные операции по очистке строки перед ее поступлением в базу данных.
Я также использовал шаблон SQL, который UPDATE
указывает на базу данных, и если строки не были вставлены (@@ROWCOUNT=0
>> Идентификатор не найден), вместо него будет INSERT
.