使用Ajax保存模态框数据时,复选框值无法存入数据库的问题
问题分析
你遇到的核心问题是变量作用域不匹配:你在#saveRoute的点击事件里收集了选中的复选框值,但这个categories变量是该点击事件函数的局部变量,外面独立的saveRoute()函数根本访问不到它。所以当AJAX发送请求时,categories实际上是undefined,传到后端自然就变成了null。
看你的代码细节:
- 第一个代码块里的
categories只存在于$('#saveRoute').click()的回调函数内部,外部无法访问。 - 第二个代码块的
saveRoute()函数里写了var categories = categories;,这相当于声明了一个变量但没赋值,结果就是undefined。
解决方案
最直接的修复方式是把收集复选框值的逻辑移到saveRoute()函数内部,这样就能在发送AJAX请求前实时获取选中的复选框值。
修改后的saveRoute()函数如下:
function saveRoute(){ // 先实时收集选中的复选框值 var myCat = []; $.each($("input[name='categories']:checked"), function(){ myCat.push($(this).val()); }); var categories = myCat.join(", "); var active = ""; var from_location = $('#from_location').val(); var to_location = $('#to_location').val(); var leaving_date = $('#leaving_date').val(); var return_job = $('#return_job').val(); var route_name = $('#route_name').val(); var expires = ""; var user_id = <?php echo $my_id; ?>; var type_of_vehicle = $('#type_of_vehicle').val(); $.ajax({ url:'<?php echo site_url('router/add_route');?>', method:'POST', data:{ active : 'Yes', from_location : from_location, to_location : to_location, categories : categories, // 现在这个变量有正确的选中值了 leaving_date : leaving_date, return_job : return_job, route_name : route_name, expires : '2018-05-15', user_id : user_id, }, success: function(data) { alert(categories); console.log(data); $('#routeModal').modal('hide'); alert('Route has been successfully added'); location.reload(); } }); }
同时,你可以删掉原来单独的$('#saveRoute').click()事件绑定代码,确保你的按钮点击是直接调用saveRoute()(比如按钮上写onclick="saveRoute()")。
额外优化建议
- 可以给复选框的选择器加父元素限定,比如
$('#routeModal input[name="categories"]:checked'),避免页面其他地方同名的复选框干扰。 - 如果后端支持数组接收,也可以直接传
myCat数组(不用join成字符串),后端用$_POST['categories']就能拿到数组,后续分类处理会更灵活。
内容的提问来源于stack exchange,提问作者Husein Hamza
相关产品推荐
相关产品推荐

