Повторное отображение базы данных приводит к вводу данных при обратной ссылке на страницу - PullRequest
0 голосов
/ 10 октября 2018

Я использую ColdFusion 16, HTML5, JavaScript и MSSQL для своего проекта.

У меня есть форма с именем, адресом электронной почты, адресом для выставления счета и адресом доставки и номером телефона, который после отправки формы вставляет эту информацию в базу данных.На другой странице у меня есть ссылка, чтобы вернуться на ту же страницу на тот случай, если пользователь захочет изменить информацию.

Как мне отобразить то, что находится в базе данных в этих полях?

Также, как мне сделать страницу точно такой же, как с того момента, когда она была оставлена.

Например, флажок, отмеченный стрелкой о том, что оплата и доставка одинаковы.Или мои скрытые поля отображаются, если они были показаны при отправке страницы.

  <div class="row">
    <div class="col-lg-4">
        <div class="form-group">
            <label for="firstname">Name of owner:</label>
            <cfoutput><input type="text" class="form-control input-sm" name="firstname" id="firstname" placeholder="First" maxlength="100" required="yes" value="" /></cfoutput>
          </div>
        </div>
    <div class="col-lg-4">
        <div class="form-group">
            <label>&nbsp;</label>
              <cfoutput><input type="text" class="form-control input-sm" name="middlename" id="middlename" placeholder="Middle" maxlength="100" value="" /></cfoutput>
          </div>
    </div>
    <div class="col-lg-4">
        <div class="form-group">
            <label>&nbsp;</label>
              <cfoutput><input type="text" class="form-control input-sm" name="lastname" id="lastname" placeholder="Last"  maxlength="100" required="yes" value="" /></cfoutput>
          </div>
    </div>
  </div>

1 Ответ

0 голосов
/ 10 октября 2018

Когда вы находитесь на своей странице адреса, вы можете использовать запрос для заполнения страницы.

Вам понадобится какой-то идентификатор для подтверждения записи, которую вы хотите редактировать.Я предполагаю, что запись об отправке будет введена на основе какого-либо идентификатора сеанса.

Моя теоретическая настройка базы данных:

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.

...