【问题标题】:AJAX request from Codeigniter view gives an error来自 Codeigniter 视图的 AJAX 请求给出错误
【发布时间】:2016-01-08 06:27:43
【问题描述】:

CSRF 保护已启用。

我有意见

我正在尝试通过 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,并且代码有效。我不明白这里发生了什么。第 83 个数组因某种原因被 PHP(或 CI)截断。

【问题讨论】:

  • 添加到控制器或config.php, $config['csrf_protection'] = false;
  • @NiranjanNRaju:我做不到。
  • 每次都会出现这个错误吗??
  • @NiranjanNRaju:如果只有 2 行移位,则会插入值。但如果有更多,在这种情况下为 3,则不会将任何内容插入 db,但会在控制台中出现错误。
  • 我认为您传递的值更多,但我不确定,请尝试 json_encode() 并在控制器 json_decode() 中发送。

标签: php jquery ajax codeigniter csrf


【解决方案1】:

问题已解决。通过 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多