Codeigniter视图的AJAX请求出错

时间:2015-10-10 10:28:53

标签: php jquery ajax codeigniter csrf

已启用CSRF保护。

我有一个观点 enter image description here

我试图通过AJAX将轮班插入数据库表。

$('#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但在控制台中出现错误。

  

遇到错误您请求的操作不是   允许的。

当我对此错误进行搜索时,我发现在CSRF问题的情况下会抛出这种情况。但我无法找到解决问题的方法。有人可以帮忙吗?

更新

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

  

遇到PHP错误

     

严重性:通知消息:数组到字符串转换

     

文件名:mysql / mysql_driver.php行号:589

数据库错误。 INSERT查询就像这样

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

用于生成项目数组的代码是相同的,但是从arr [83]开始问题。我试过在浏览器第83天(第3行第23天)之后删除tds并且代码工作正常。我不明白这里发生了什么。由于某种原因,PHP(或CI)导致第83个阵列被切断。

1 个答案:

答案 0 :(得分:0)

问题已解决。从AJAX POST传递给控制器​​的数组的一些元素(从数组(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