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