链接回页面时,在输入中重新显示数据库结果

时间:2018-10-10 15:38:44

标签: coldfusion coldfusion-2016

我在我的项目中使用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 :(得分:2)

在“地址”页面上,您可以使用查询来填充页面。

您将需要某种ID来验证要编辑的记录。我假设将根据某种会话标识符输入运输记录。

我的理论数据库设置:

结算地址

| 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设置为serializeJSON(getShippingAddress) == serializeJSON(getBillinAddress)。如果两个查询中的所有字段都相同,则还可以将两个查询都转换为JSON并进行比较。 (<input type="text" name="BillingShippingSame" <cfif BillingShippingSame>checked="checked"</cfif> /> )。如果您需要检查多个字段,这将节省一些输入,但是只有两个查询中的字段相同时,它们才会序列化。然后只需在复选框输入中设置值即可。

BillingShippingSame

如果愿意,您可以对页面进行JavaScript处理,以便选中form,它可以禁用“帐单”字段,或者仅继续使用数据库返回的内容填充它们。

返回我们的工作流程。由于HTML如果未选中,则不会通过该复选框,因此只需查看<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

在涉及urlcleanString或其他不可靠的输入时,我倾向于偏执狂。我的UPDATE函数会在字符串进入数据库之前对其进行各种清理。

我还使用了@@ROWCOUNT=0数据库的SQL模式,如果没有插入任何行(找不到INSERT >> ID),那么它将改为In [1]: import jupyterthemes In [2]: print(jupyterthemes.__file__)