当coldfusion中的复选框发生更改时,如何更新数据库?

wgmfuz8q  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(360)

因此,我创建了一个表,其中一列是一个名为“arrived”的复选框,这意味着如果客户机到达,我将选中该复选框,它将用当前时间更新我的数据库(mysql)。我知道我必须使用jquery向coldfusion发出ajax请求并更新数据库,但我不知道如何做到这一点。有人能给我举个小例子说明怎么做吗?谢谢你,hg
更新
所以我一直在做我的项目的一些东西,我发现了一个问题。
这是我的javascript代码:

$(document).ready(function() {
           $(".predicted").on("change",function(event){
                var hora = this.value;
                console.log("Updating time = "+ hora);
                var id = jQuery('input[type=hidden][name=id]').val();;
                console.log(id);
                $.ajax({
                        url: "horaPrevista-update-database.cfc"
                        , type: "POST"
                        , dataType: "json"
                        , data: {"method" : "updatePredicted", "returnFormat": "json", "hora": hora, "id": id}
                    }).done(function(response) {
                        console.log("response", response);
                    }).fail(function(jqXHR, textStatus, errorMessage) {
                       console.log("errorMessage",errorMessage);
                    });
               window.location.reload(true);
          });
        });

这是my hc-update-database.cfm:

<cfcomponent>   
<cfset variables.dsn = "listareservas">

<cffunction name="updatePredicted" returntype="struct" access="remote">
   <cfargument name="hora" type="string" required="true">
   <cfargument name="id" type="numeric" required="true">

   <cfset local.response = {success=true}>

   <cftry>
       <cfquery datasource="#variables.dsn#">
           UPDATE Reservas
           SET    ReservaTempoPrevisto = <cfqueryparam cfsqltype="cf_sql_timestamp" value="#arguments.hora#"> 
           WHERE  ReservaID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.id#">
       </cfquery>
       <cfcatch>    
           <!--- add handling here... --->
           <cfset local.response = {success=false}>
       </cfcatch>
   </cftry>

   <cfreturn local.response>
</cffunction>

我有一个由查询填充的表。

<cfoutput query="getReservations">
     <tbody>
          <tr>
              <td><input class="form-control predicted" name="predicted" id="ReservaHoraPrevisto" placeholder="HH:MM" value="#timeFormat(ReservaTempoPrevisto,'HH:mm')#">
                  <input type="hidden" name="id" class="id" value="#ReservaID#"></td>
          </tr>
      </tbody>

例如,如果我的查询getreservations有10条记录,它将显示10个输入。问题是,如果我尝试更改输入,它总是在数据库中更新表中显示的第一条记录(它总是将第一条记录值ţreservaidţ发送到hc update database.cfm)。如何将这两个值发送到cfc(输入和id)?

oknwwptz

oknwwptz1#

尝试以下操作:
表单模板:
表单模板.cfm

<cfparam name="url.clientid" default="0">

<cfoutput>

  <!DOCTYPE html>
  <html>
    <head>

      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script>

      <script type="text/javascript">

        jQuery(document).ready(function() {

          jQuery("input[type=checkbox][name=arrived]").on('click',function(event){
            var currentObj = jQuery(event.currentTarget);
            if(currentObj.prop("checked") === true){
              var ajaxurl = "ajax-update-database.cfm?clientid=" + jQuery('input[type=hidden][name=clientid]').val();
              jQuery.ajax({
                url:ajaxurl
              })
              .done(function(response) {
                var obj = JSON.parse(response);
                console.log("obj",obj);
              })
              .fail(function(jqXHR, textStatus, errorMessage) {
                console.log("errorMessage",errorMessage);
              });
            }
          });

        });

      </script>

    </head>

    <body>

      <form>
        <label for="arrived">Arrived</label><br />
        <input type="checkbox" name="arrived">
        <input type="hidden" name="clientid" value="#url.clientid#">
      </form>

    </body>
  </html>

</cfoutput>

ajax模板:
ajax-update-database.cfm

<cfparam name="url.clientid" default="0">
<cfparam name="variables.response" default="#StructNew()#">

<cfset variables.response['error'] = "">

<cfif Val(url.clientid)>

  <cftry>
    <cfquery datasource="yourDSN">
      UPDATE yourDBTable
      SET Arrived = <cfqueryparam cfsqltype="cf_sql_tinyint" value="1">, Submission_date = <cfqueryparam cfsqltype="cf_sql_timestamp" value="#Now()#"> 
      WHERE ClientID = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.clientid#">
    </cfquery>
    <cfcatch>
      <cfset variables.response['error'] = "An error occurred whilst trying to update the database">
    </cfcatch>
  </cftry>

</cfif>

<cfoutput>

# SerializeJSON(variables.response)#

</cfoutput>
v64noz0r

v64noz0r2#

无论我选中哪个复选框,它总是更新数据库中出现在表中的第一条记录
这是因为演示示例设计时考虑了一条记录。如果表单实际上处理多个记录,则需要修改js和cf代码。
因为您只将id传递给cf,所以不需要单独的隐藏字段。只需使用“reservaid”作为复选框值。当复选框状态更改时,使用“更改”事件更新记录。下面的示例在选中一个框时更新记录。请记住,用户可以取消选中一个框-或重新检查它。您需要决定如何在数据库端处理这些事件,并相应地修改代码。取消选中时是否要清除到达日期?如果重新检查,用当前日期和时间更新记录,等等。。。?
注意,我的首选是对ajax调用使用cfc。js代码很相似,只是不同的url和数据参数

<!--- manual query for DEMO --->
<cfset getReservations = queryNew("ReservaID","integer",[[1],[2],[3],[4]])>

<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
   $(".arrived").on("change",function(event){
        if (this.checked) {
            var reservaID = this.value;
            console.log("Updating id = "+ reservaID);
            $.ajax({
                url: "SomeComponent.cfc"
                , type: "POST"
                , dataType: "json"
                , data: {"method" : "updateArrival", "returnFormat": "json", "id": reservaID}
            }).done(function(response) {
                console.log("response", response);
            }).fail(function(jqXHR, textStatus, errorMessage) {
               console.log("errorMessage",errorMessage);
            });
        }
  });
});
</script>

<form>
    <cfoutput query="getReservations">
        <input type="checkbox" class="arrived" name="arrived" value="#ReservaID#" />
    </cfoutput>
</form>

在cf端,创建一个接受单个数字id的远程函数。

<cfcomponent>   
    <cfset variables.dsn = "listareservas">

    <cffunction name="updateArrival" returntype="struct" access="remote">
       <cfargument name="id" type="numeric" required="true">

       <cfset local.response = {success=true}>

       <cftry>
           <cfquery datasource="#variables.dsn#">
               UPDATE Reservas
               SET    ReservaHoraChegada = <cfqueryparam cfsqltype="cf_sql_timestamp" value="#Now()#"> 
               WHERE  ReservaID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.id#">
           </cfquery>
           <cfcatch>    
               <!--- add handling here... --->
               <cfset local.response = {success=false}>
           </cfcatch>
       </cftry>

       <cfreturn local.response>
    </cffunction>
</cfcomponent>

相关问题