代码之家  ›  专栏  ›  技术社区  ›  David Brierton

当链接回页面时,重新显示数据库会产生输入

  •  1
  • David Brierton  · 技术社区  · 6 年前

    我正在使用coldfusion16、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 回复  |  直到 6 年前
        1
  •  2
  •   Shawn    6 年前

    当您在地址页上时,可以使用查询填充该页。

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

    我的理论数据库设置:

    帐单地址

    | ID | Address1      | etc... |
    ===============================
    | 1  | 123 Sesame St | ...... |
    

    发货地址

    ===============================
    |芝麻街123号|
    

    在初始表单上,我们可以查询数据库以查看是否有用户的记录。

    <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 .... >
    

    这只是说如果两个查询中的地址字段相同,那么设置 帐单发货名称 true 否则 false . 如果两个查询中的所有字段都相同,还可以将两个查询转换为JSON并进行比较( serializeJSON(getShippingAddress) == serializeJSON(getBillinAddress) ). 如果您有多个需要检查的字段,这将节省一些输入,但是只有当两个查询中的字段相同时,它们才会序列化相同的字段。然后在复选框输入中设置值。

    <input type="text" name="BillingShippingSame" <cfif BillingShippingSame>checked="checked"</cfif> />
    

    如果你想的话,你可以用javascript写这个页面 帐单发货名称

    form 查看是否选中了该框。如果是,则将Billing details设置为Shipping details。

    插入/更新查询:

    <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>
    

    形式 url 或其他不可信的输入。我的 cleanString 函数将在字符串进入数据库之前对其进行各种清理。

    UPDATE 如果没有插入行( @@ROWCOUNT=0 &燃气轮机&燃气轮机;没有找到身份证),那么它会的 INSERT