【问题标题】:Adding exactly 100 values to database using ajax使用 ajax 将 100 个值添加到数据库
【发布时间】:2011-07-24 06:49:46
【问题描述】:

向数据库添加 100 分的最简单/最快的方法是什么?请假设由于重复、错误数据等原因,所有写入都无法正常工作。

我正在尝试用恰好 100 个值更新数据库。

一旦我有一个好的数据,我需要将它添加到数据库中,我使用一个名为 updateDB 的函数。

这个函数只是将一个纬度/经度坐标写入数据库。如果有重复或写入失败,我会从 php 发送“错误”,循环应该继续收集数据,直到我有 100 个点到数据库。这是我正在使用的函数。

cct是用来防止xss的,请忽略,这个很好用。

////more above this
if(100-completed > dispatched)
    dispatched++;
    updateDB(lat,lng);
/// more junk and then this function
function updateDB(lat,lng)
{
    var cct = $("input[name=csrf_mysite]").val();
    $.ajax({
        type: "POST",
        url: "/form",
        data: { 
            'lat': lat,
            'lng': lng,
            'id_set': id_set,
            'csrf_complexity': cct },
        success: function(result) {
            var obj = jQuery.parseJSON(result);
            if( obj.status === "OK" )
            {
                completed++;
                var marker = new google.maps.Marker(
                {
                    icon: markerIcon,
                    position: new google.maps.LatLng(lat, lng),
                    map: map
                });
                $( "#progressbar" ).progressbar( "option", {
                    value: completed,
                    max: 100
                });
                $("#amount").text("Getting image " + completed + " of 100");
            }
        },
        error: function(data){
            //alert(data.responseText);
            },
        complete: function(data){
            if(completed == 100)
                window.location = "/start/curate";
            dispatched--;
        }
    });
}

此功能不起作用。所以知道为什么吗?

它应该很简单。调用 updateDB 直到它达到 100 个附加值,并且仅在不可能有​​额外调用时才调用 updateDB。 Dispatch 没有正确递减,所以我假设 complete 不会在每个事件上调用。

想法?或者任何其他方式来做到这一点都很棒。

【问题讨论】:

    标签: php jquery mysql ajax codeigniter


    【解决方案1】:

    为什么不让服务器代码处理计数并只发送一个(或几个)查询?例如。首先构造一个包含 100 个数据点的数组,在单个查询中将数据发送到服务器,让它响应它还需要多少个数据点,然后发回那么多数据点,然后再做一次,直到它有 100 个。

    如果在客户端获取每条数据的开销很低,获取不需要的数据就可以了,那么就先发送(比如说)110。了解一些故障率知识后,您应该能够轻松地对其进行优化。

    你一次只能有(我相信)两个同步的异步查询,不管是否异步,这需要很长时间才能做到这一点。我想不出任何理由不尽可能多地对数据进行分组并将查询数量减少到 1 个或少数几个。即使您仍然在服务器上运行 100 个数据库查询,与 HTTP 发布/响应的开销相比,执行此操作的时间也无关紧要。

    【讨论】:

    • 迄今为止唯一合理的答案
    【解决方案2】:

    编写你的服务器端脚本来响应一个数字 - 然后在第一个请求中你发送了 100 个数据点:

    Browser             Server
      |                   |
      |---> 100 data ---> |
      |<- send 20 more <- |
      |                   |
      |--->  20 data ---> |
      |<- send  1 more <- |
      |                   |
      |--->  1  data ---> |
      |<- send  0 more <- |
      |                   |
      v                   v
    

    就像在客户端计算服务器端处理了多少信息时,您不会遇到那种同步问题 - 服务器处理数据,排除重复,格式错误等,并且服务器计算它需要什么。

    客户端所要做的就是发送它可以发送的所有内容并轮询服务器以了解还需要多少。此外,由于 Ajax 请求的开销,您还想一次发送多个点,但您不想发送比实际需要的更多的点,因为这也很浪费。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      if(100-completed &gt; dispatched) 应该是:

      while(100-completed > dispatched)
      

      假设完成是从 0 开始。

      【讨论】:

      • 如果这是同步的,那将起作用,但它不适用于异步进程。如果我完成了 99 个,通常它会有未完成的线程。到页面重定向时,通常会多完成 2-3 个线程,这意味着 102-103 在数据库中。
      • 我不是一个 php/jquery 人 - 在实例化 ajax 请求后是否需要调用一些方法,例如:begin_send()?
      • 当然你仍然需要 while,if 只会评估一次 - 我已经更新了我的答案
      • 我不得不说 - 发送 100 个请求似乎很疯狂 - 为什么?!
      【解决方案4】:

      您需要将 async:false 添加到您的 .ajax 调用中,并根据您编写的成功/错误方法递增/递减。

      如果您的意思是这是一个连续的迭代过程,其中用户一次输入 100 个值,而您的程序一旦有 100 个值就停止请求信息,您可能需要做一个简单的检查服务器端并以这种方式更新您完成/发送的值。但是,在您的 .ajax 调用中设置 async:false 会阻止您并等待调用的响应,然后再继续前进。

      【讨论】:

      • 这也让我正在做的过程变慢。关闭异步意味着页面大约需要 2 分钟才能增加 100 分。使用 async 大约需要 20 秒(但有时我会得到 100-107 分)
      • 如果 SELECT COUNT(*) FROM TABLE 返回 >= 100 工作,是否会在您的 PHP 中添加一个不允许插入值的简单检查?
      【解决方案5】:

      这很奇怪。我已经能够在不到一秒的时间内加载大约 1000 个 DB 加载的地图标记。

      您应该加载所有 100 个服务器端并将它们添加到一个请求中。请求成本通常相当大(对于像连接数据库和加载一项这样的简单任务,可能需要花费 70% 的时间用于请求,而 30% 的时间用于实际工作)。

      【讨论】:

        【解决方案6】:

        也许这是我个人对 JSON 和序列化表单数据的喜爱,但您是否想过在客户端简单地序列化数据包、发送数据并请求通过/失败响应?

        【讨论】:

          【解决方案7】:

          我认为您的代码中有错误,但我不确定这是否只是打字错误。

          if(100-completed > dispatched) dispatched++; updateDB(lat,lng);

          根据您想要在 if 子句中调用 updateDB 的缩进,但您没有使用花括号,因此即使该语句为真与否,您也可以调用它。如果没有这个错误,虽然如果你使用@jamietre 建议的方法你的实现会更好,你的代码应该可以工作。

          【讨论】:

            【解决方案8】:

            编辑:不要介意这个答案,'if' 语句中缺少的大括号让我失望,只有在 100-completed &gt; dispatched 时才调用 updateDB 对吗?

            假设我了解您的问题,看来这可能是时间问题。例如,当完成 = 99 时,updateDB 函数可以在第一次执行成功回调之前被调用 4 次,因为完成时间是 99,然后它仍然有 3 次排队(取决于围绕 'if 的代码' 陈述)。所以,它会更慢,但如果你可以确保 updateDB 在“完成”回调之前不会再次被调用(和/或成功/错误,如果你认为完成不是每次都被调用),你认为可以解决吗?
            如果你在updateDB(lat,lng);completed++ 两行设置断点,这就是我想象的执行顺序:

            1. updateDB(lat,lng); (其中已完成 =99)
            2. updateDB(lat,lng); (其中已完成 =99)
            3. updateDB(lat,lng); (其中已完成 =99)
            4. updateDB(lat,lng); (其中已完成 =99)
            5. 已完成++; (现已完成=100,还有 3 个 ajax 调用仍在执行)
            6. 已完成++; (现已完成=101)
            7. 已完成++; (现已完成=102)
            8. 已完成++; (现已完成=103)

            我的第一个想法是在完成的回调中添加一个标志,如下所示:

            完成:函数(数据){
            ok_to_run_again_flag=true;
            已发送--;
            如果(完成 == 100)
            window.location = "/start/curate";
            };

            if((100-completed > dispatched) && ok_to_run_again_flag)
            {
            ok_to_run_again_flag=false;
            派遣++;
            更新数据库(纬度,经度);
            }

            我也想知道您为什么说“调度没有正确递减”。与您的预期相比,它的价值是多少?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-08-06
              • 2012-07-01
              • 1970-01-01
              • 1970-01-01
              • 2016-06-02
              • 1970-01-01
              相关资源
              最近更新 更多