已启用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并且代码工作正常。我不明白这里发生了什么。由于某种原因,PHP(或CI)导致第83个阵列被切断。
答案 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