Повторное отображение базы данных приводит к вводу данных при обратной ссылке на страницу.

Я использую 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>

person David Brierton    schedule 10.10.2018    source источник
comment
Если ваш пользователь уже отправил информацию, ваша страница изменилась со страницы INPUT на страницу UPDATE. Вы можете запросить в своей таблице вставки запись, которую они отправили, и вывести эту информацию обратно в форму. Сохраняется ли ваш ящик для выставления счетов и доставки одинаково в вашей базе данных? Если нет, вы можете использовать некоторую магию запросов, чтобы вернуть значение для этого, если адреса выставления счетов и доставки БД совпадают.   -  person Shawn    schedule 10.10.2018
comment
Ссылка, ведущая на страницу, может включать идентификатор добавленной записи. При отображении формы проверьте, существует ли идентификатор, и если он существует, запросите данные в базе данных.   -  person Redtopia    schedule 10.10.2018
comment
Вы бы не хотели передавать идентификатор по ссылке, если можете помочь. По крайней мере, не без МНОГО проверки, чтобы никто не мог редактировать любую запись, которую он хотел. Было бы лучше отправить значение через сеанс или какой-либо другой менее легко модифицируемый идентификатор.   -  person Shawn    schedule 10.10.2018
comment
Согласен ... вам нужно будет подтвердить любые изменения в записи, и вы, вероятно, захотите использовать какой-то uuid или неугадываемый идентификатор, если вы отправите его через URL-адрес. Помещение идентификатора в сеанс может быть хорошим способом.   -  person Redtopia    schedule 10.10.2018


Ответы (1)


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

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

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

Платежный адрес

| 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, который UPDATEs база данных, и если строки не были вставлены (@@ROWCOUNT=0 >> ID не был найден), то вместо этого будет INSERT.

person Shawn    schedule 10.10.2018