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
已启用 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