简体   繁体   中英

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

here i'am trying to insert multiple rows at same time in my case more than 200-250 rows at same time but i got below error

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

but when i increased the max_input_vars = 3000 this solved problem was now iam able to insert but it is taking too much time.

i want to insert faster but need help

this is my php code

  <?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);
}

here is my ajax code. using this iam able to sent request to insert but it is takin to much time

<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

A simple 2-line fix to allow for unlimited items: Suggest you encode the array into JSON for POSTing, then use json_decode() to turn it back into an array when it arrives in PHP.

But, I have to ask... Are there really hundreds of new (or changed) rows? If only a few rows, consider shipping one row at a time via AJAX to PHP -- perhaps based on whether a value has changed after the mouse leaves "focus". A lot of little AJAX calls would have a lot of overhead (launching many PHP threads), but the task would be finished by the time you leave the web page. It would "feel" as if every thing was "instantaneous". (OK, if you have a thousand users doing this same thing at the same time, this technique could overload the server.)

Arrays

Here's another approach: Use "arrays". If the input names end in [] :

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

the will come in as an array in $x . If you have multiple of these, then the subscripts (0, 1, ...) will let you match them up.

$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 includes $_POST ; change it if you would prefer)

INSERT

As for the speed of a MySQL insert... A single INSERT with 100 rows will run 10 times as fast 100 1-line INSERTs . So, if there are really hundreds of new rows, I recommend "batching" the inserts.

If most of the rows are already in the table, then INSERT IGNORE is a 'simple' way to deal with that. But... If there is an AUTO_INCREMENT id on the table, the dups will "burn" ids.

IODKU is the optimal way to deal with rows that are either new or modified. It, too, can be batched. But, it also burns ids if the query is not including the original id where available.

(I can elaborate, you you elaborate.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM