THINKPHP_(5)_THINKPHP6接收ajax下拉菜单提交的数据,存在的bug

时间:2023-03-09 03:20:57
THINKPHP_(5)_THINKPHP6接收ajax下拉菜单提交的数据,存在的bug

反思:

国产总是不尽人意,但是要支持国产。

ThinkPHP的6接收ajax的post数据,存在一个bug。即ajax传递的json数据,在thinkphp后端解析出来后,并非直接的json格式。

描述:

三级联动,此处不赘述如何实现。以省市县为例,当点击省的下拉菜单时,我们设置监听函数:

  layui.use(['form','cjgl'], function(){
var config = {
s1: 'xunliandui_id',
s2: 'xunlianying_id',
s3: 'xunlianlian_id',
v1: null,//默认的训练队id
v2: null,//默认的训练营id
v3: null,//默认的训练连id
}; var form = layui.form;
form.on('select(' + config.s1 + ')', function(data){
cityEvent(data);
});
function cityEvent(data) {
// alert('yes');
var $ = layui.jquery;
var $form = $('form');
$form.find('select[name=' + config.s2 + ']').html("");
// alert('no');
var myjson = JSON.stringify({parent_id:data.value});
// $.post("/system/school/xiajidanwei",myjson,function(result){
//
// },'JSON'); $.ajax({
url:"/system/school/xiajidanwei",//查询下级子单位
type:"post",
data:myjson,
dataType:'json',
success:function(result){
if(result.code == 0)
{
alert('xxx');
$.each(result.data, function(index,item){
console.log(item);
});
}else{
layer.msg(result.msg);
}
},
error:function(xhr,status,error) {
layer.msg('数据处理错误',{
icon: 2,
time: 2000 //2秒关闭(如果不配置,默认是3秒)
});
}
});
}
});

上述代码中,使用的是layui的jquery,无论是$.post还是$.ajax,其功能同。

当点击下拉菜单进行选择后,会执行js的cityEvent函数。

我们构造json字符串,即myjson。

但是,thinkphp后端利用$_POST接收的内容为:

THINKPHP_(5)_THINKPHP6接收ajax下拉菜单提交的数据,存在的bug

因此,我们的后端需要特殊处理:

    public function ajaxData2()
{
// 获取参数
$a=array();
$a[0]=1000;
$src = $this->request
->only([
'parent_id' => ''
],'POST');
// 实例化
// $parent_id=$_POST["parent_id"];
foreach($_POST as $key=>$value){
$key=json_decode($key);
$parent_id=$key->{"parent_id"};
if($parent_id){
break;
}
} $sch = new sch;
$data = $sch->where('status',1)->where('parent_id',$parent_id)->select();
$data = reSetObject($data, $src); return json($data);
}

利用foreach取出$_POST的索引值,然后转化为json,再取出parent_id中的数据。

结论:

jquery.ajax以json传递的数据,在thinkphp6的后端,变成了数组的索引。而非json数据。

国产的库和框架,需要加油啊。