AJAX 来自 Codeigniter 视图的请求出错

AJAX request from Codeigniter view gives an error

已启用 CSRF 保护。

我有意见

我正在尝试通过 AJAX 将班次插入数据库 table。

$('#insert_shift').click(function(e) {
    e.preventDefault();
    var empty_td = $('.td_shift[data-type=""]').size();
    if (empty_td == 0) {
        var date = $('#atdnc_date').val() + '-';
        var arr = [];
        var new_arr = [];
        $('.td_shift').each(function() {

            //if($(this).attr('data-day') != 0){

            var data_type = $(this).attr('data-type');
            var shift_atdnc_id = $(this).attr('data-typeid');
            var user_id = $(this).attr('data-user');
            var new_date = date + $(this).attr('data-day');

            if (data_type == 'shift') {
                var shift_strt_time = $(this).attr('data-start');
                var shift_end_time = $(this).attr('data-end'); // Change new_arr to old
                var new_arr = {
                    'shift': shift_atdnc_id,
                    'user_id': user_id,
                    'date': new_date,
                    'shift_strt_time': shift_strt_time,
                    'shift_end_time': shift_end_time,
                    'checkin_time': '00:00:00',
                    'checkout_time': '00:00:00',
                    'time_spent': '00:00:00',
                    'checkin_reason': 'NA',
                    'checkout_reason': 'NA',
                    'work_report': 'NA',
                    'attn_status': 0
                };
            } else if (data_type == 'attendance') {
                var new_arr = {
                    'shift': shift_atdnc_id,
                    'user_id': user_id,
                    'date': new_date,
                    'shift_strt_time': '00:00:00',
                    'shift_end_time': '00:00:00',
                    'checkin_time': '00:00:00',
                    'checkout_time': '00:00:00',
                    'time_spent': '00:00:00',
                    'checkin_reason': 'NA',
                    'checkout_reason': 'NA',
                    'work_report': 'NA',
                    'attn_status': shift_atdnc_id
                };
            }

            arr.push(new_arr);

            //}

        });
        $.post(base_url + 'test_shift/insert_shift', {
                a: arr,
                csrf_test_name: csrf_token
            },
            function(data) {
                alert(data);
                if (data == 1) {
                    document.location.href = base_url + 'test_shift';
                } else {
                    alert("error");
                }
            }
        );
    } else {
        alert("Please fill all the shifts");
    }
});

如果只有 2 行移位,则将插入值。但如果有更多,在这种情况下为 3,则不会向 db 插入任何内容,但会在控制台中出现错误。

An Error Was Encountered The action you have requested is not allowed.

当我搜索这个错误时,我知道这是在 CSRF 问题的情况下抛出的。但我找不到解决问题的方法。有人可以帮忙吗?

更新

当我更改 POST 中的数据顺序时,上述错误消失了。但是现在又出现了一个。

A PHP Error was encountered

Severity: Notice Message: Array to string conversion

Filename: mysql/mysql_driver.php Line Number: 589

还有一个数据库错误。 INSERT 查询是这样的

INSERT into table_name () values ('1','some_value'),('2','some_value2'),Array

用于生成项目数组的代码是相同的,但问题从 arr[83] 开始。我尝试在第 83 天(即第 3 行第 23 天)后从浏览器中删除 tds,并且代码有效。我不明白这里发生了什么。第 83 个数组由于某种原因被 PHP(或 CI)截断了。

问题已解决。 AJAX POST 传递给控制器​​的数组的某些元素(从 array(83) 开始)被弹出,这导致数据库错误。我还不知道确切的原因,但经过一些研究我发现 this thread。因此,为了安全起见,我没有在单个 INSERT 查询中插入所有值,而是在一个插入查询中插入了一名员工一个月的班次。

将javascript修改为

$('#insert_shift').click(function(e) {
  e.preventDefault();

  var empty_td = $('.td_shift[data-type=""]').size();

  if (empty_td == 0) {

    var num_of_days = parseInt($('.th_day').last().text());
    var num_of_users = parseInt($('.user_shift_row').size());
    var insert_helper = 0;
    var post_finish_helper = 0;

    var date = $('#atdnc_date').val() + '-';
    var arr = [];
    var new_arr = [];

    function insert_shift_per_user() {

        $('.td_shift[data-inserted="0"]').each(function() {

          insert_helper++;

          var data_type = $(this).attr('data-type');
          var shift_atdnc_id = $(this).attr('data-typeid');
          var user_id = $(this).attr('data-user');
          var new_date = date + $(this).attr('data-day');

          if (data_type == 'shift') {
            var shift_strt_time = $(this).attr('data-start');
            var shift_end_time = $(this).attr('data-end'); // Change new_arr to old
            var attn_status = 0;
            var shift = shift_atdnc_id;
          } else if (data_type == 'attendance') {
            var shift_strt_time = "00:00:00";
            var shift_end_time = "00:00:00";
            var attn_status = shift_atdnc_id;
            var shift = 0;
          }

          new_arr = {
            'user_id': user_id,
            'date': new_date,
            'shift': shift,
            'attn_status': attn_status,
            'shift_strt_time': shift_strt_time,
            'shift_end_time': shift_end_time
          };

          arr.push(new_arr);

          if (insert_helper == num_of_days) {

            $.post(base_url + 'test_shift/insert_shift', {

                csrf_test_name: csrf_token,
                a: arr
              },
              function(data) {

                if (data == 1) {

                  arr = []; // clearing the array
                  new_arr = []; // clearing the new_array
                  insert_helper = 0;

                  $('.td_shift[data-user="' + user_id + '"]').attr('data-inserted', 1);

                  post_finish_helper++;

                  if (post_finish_helper == num_of_users) {
                    document.location.href = base_url + 'test_shift';
                  } else {
                    insert_shift_per_user();
                  }
                } else {
                  alert("Error");
                }

              }
            );



          } //if insert_helper == num_of_days ends

        });

      } // FUNCTION insert_shift_per_user

    insert_shift_per_user();


    //var aa = jQuery.parseJSON(arr);
    //console.log(arr);

  } else {
    alert("Please fill all the shifts");
  }



}); //insert_shift ends here