如何使用 PHP MySQL ajax 在数据库中插入多行使用更好的技术来更快地插入

how to insert multiple rows inside database using PHP MySQL ajax using better technique for faster insert

在这里,我尝试同时插入多行,在我的情况下,同时插入多行超过 200-250 行,但出现以下错误

 Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini

但是当我增加 max_input_vars = 3000 时,这个已解决的问题现在可以插入了,但是它花费了太多时间。

我想更快地插入但需要帮助

这是我的php代码

  <?php
include "connection.php";
if (isset($_POST['close_val'])) {
    $item_cid = $_POST["item_cid"];
    $item_id = $_POST["item_id"];
    $op_date = $_POST["op_date"];
    $op_value = $_POST["op_value"];
    $close_date = $_POST["close_date"];
    $close_val = $_POST["close_val"];
    


    // Converting the array to comma separated string 




    for ($count = 0; $count < count($item_id); $count++) {
        $item_cid_clean = mysqli_real_escape_string($conn, $item_cid[$count]);
        $item_id_clean = mysqli_real_escape_string($conn, $item_id[$count]);
        $op_date_clean = mysqli_real_escape_string($conn, $op_date[$count]);
        $op_value_clean = mysqli_real_escape_string($conn, $op_value[$count]);
        $close_date_clean = mysqli_real_escape_string($conn, $close_date[$count]);
        $close_val_clean = mysqli_real_escape_string($conn, $close_val[$count]);

        


        $sql = "SELECT COUNT(*) AS cntuser from bar_opening_details WHERE  `item_id` = '" . $item_id_clean . "' AND   close_date='" . $close_date_clean . "' AND   item_cid='" . $item_cid_clean . "' ";
        $result = mysqli_query($conn, $sql);
        $row = mysqli_fetch_array($result);
        $count1 = $row['cntuser'];


        if ($count1 > 0) {
            // update
            $updatequery = "UPDATE bar_opening_details SET 

    `item_cid` = '" . $item_cid_clean . "',
    `item_id` = '" . $item_id_clean . "',
    `op_date` = '" . $op_date_clean . "',
    `op_value` = '" . $op_value_clean . "',
    `close_date` = '" . $close_date_clean . "',
    `close_val` = '" . $close_val_clean . "'
    
     WHERE close_date='" . $close_date_clean . "' and `item_id` = '" . $item_id_clean . "'  ";



            mysqli_query($conn, $updatequery);
        } else {

            $insertquery = "INSERT INTO bar_opening_details 
    (item_cid,
    item_id,
    op_date,
    op_value,
    close_date,
    close_val) values ('" . $item_cid_clean . "', '" . $item_id_clean . "', '" . $op_date_clean . "', '" . $op_value_clean . "', '" . $close_date_clean . "', '" . $close_val_clean . "')";

            mysqli_query($conn, $insertquery);
        }
    }

    // insert





    $return_arr = array('item_cid' => $item_cid, 'item_id' => $item_id, 'op_date' => $op_date, "close_val" => $count);
    echo json_encode($return_arr);
    mysqli_close($conn);
}

这是我的 ajax 代码。使用此 iam 能够发送插入请求,但它需要很多时间

<script>
    $(document).ready(function() {



      // submit button click
      $("#submit").click(function() {
        $('#loading').show();

        var item_cid = [];
        var item_id = [];
        var op_date = [];
        var op_value = [];
        var close_date = [];
        var close_val = [];
        


        var Toast = Swal.mixin({
          toast: true,
          position: 'top-end',
          showConfirmButton: false,
          timer: 3000
        });


        // Initializing array with Checkbox checked values
        $("input[name='item_cid[]']").each(function() {
          item_cid.push(this.value);
        });
        $("input[name='item_id[]']").each(function() {
          item_id.push(this.value);
        });
        $("input[name='op_date[]']").each(function() {
          op_date.push(this.value);
        });
        $("input[name='op_value[]']").each(function() {
          op_value.push(this.value);
        });
        $("input[name='close_date[]']").each(function() {
          close_date.push(this.value);
        });
        $("input[name='close_val[]']").each(function() {
          close_val.push(this.value);
        });
       

        $.ajax({
          url: 'lib/cbentry.php',
          type: 'post',
          data: {
            item_cid: item_cid,
            item_id: item_id,
            op_date: op_date,
            op_value: op_value,
            close_date: close_date,
            close_val: close_val
          dataType: 'JSON',
          success: function(response) {

            $('.details').show();
            // selecting values from response Object
            var name = response.close_val;
            $('#loading').hide();
            // var email = response.email;
            //  var lang = response.lang;
            //  var foundjquery = response.foundjquery;



            Toast.fire({
              icon: 'success',
              title: 'Data Entered Successfully'
            })


            // setting values
            $('#name').text(name);
            //  $('#email').text(email);
            //  $('#lang').text(lang);
            //  $('#foundjquery').text(foundjquery);
          }
        });

      });

    });

  </script>

JSON

允许无限项的简单两行修复:建议您将数组编码为 JSON 用于 POST,然后使用 json_decode() 在它到达 PHP.

但是,我不得不问...真的有数百个新的(或更改的)行吗?如果只有几行,请考虑通过 AJAX 一次传送一行到 PHP —— 可能基于鼠标离开“焦点”后值是否发生变化。许多 AJAX 的小调用会产生大量开销(启动许多 PHP 线程),但任务会在您离开网页时完成。它会“感觉”好像每件事都是“瞬间”。 (好吧,如果你有 1000 个用户同时做同样的事情,这种技术可能会使服务器过载。)

数组

这是另一种方法:使用“数组”。如果输入名称以 []:

结尾
<input type=text name=x[] ">

将以数组形式出现在 $x 中。如果你有多个,那么下标 (0, 1, ...) 会让你匹配它们。

$list = GetArray('list');

function GetArray($fn) {
    // Input an array of things from
    // echo "<input type=checkbox name=\"fn[]\" value=\"$out_fn\" $checked>\n";
    // url has &fn[]=aaa&fn[]=ccc
    $req = @$_REQUEST[$fn];           // Note: this must NOT end in []
    $fns = empty($req)     ? [] :
           (is_array($req) ? $req :
                             explode(',', $req));
    return $fns;    // always an array
}

($_REQUEST 包括 $_POST;如果您愿意,可以更改它)

插入

至于 MySQL 插入的速度...具有 100 行的单个 INSERT 将 运行 100 1 行 INSERTs 快 10 倍。所以,如果真的有数百个新行,我建议“批量”插入。

如果大多数行已经在 table 中,那么 INSERT IGNORE 是一种 'simple' 处理方式。但是...如果 table 上有一个 AUTO_INCREMENT id,复制品将“燃烧”id。

IODKU 是处理新行或修改行的最佳方式。它也可以批处理。但是,如果查询不包括可用的原始 id,它也会燃烧 ID。

(我细说,你细说。)