我的JS代码有点问题。
我有一个AJAX,我想在PHP中获取变量。
一切正常,除了" param"数据
这是代码:
$('#signup_submit').click(function (event){
param = jQuery('input').filter(function() {
return this.name.match(/param/);
}).serialize();
event.preventDefault();
$.ajax({
type: "POST",
url: result.php,
data: {
action: 'submit_ajax',
email: $('#email').val(),
send_welcome: true,
listId: $('#listid').val(),
param: param
},
success: function(msg) {
console.log('ok');
}
});
});
param(PHP)的结果var_dump:
param%5Bconfirmation%5D=1
应该是这样的:
array(1){ 'confirmation'=>1 }
有什么想法来解决它吗?
感谢
答案 0 :(得分:2)
使用serializeArray代替序列化。
param = jQuery('input').filter(function() {
return this.name.match(/param/);
}).serializeArray();
答案 1 :(得分:2)
您发布的$param
var看起来像param[confirmation]=1
您需要parse_str
函数来获取序列化数据:
parse_str($param, $output);
<强>输出强>
var_dump($output);
array(1) {
["param"]=>
array(1) {
["confirmation"]=>
string(1) "1"
}
}
或直接获取特定索引:
parse_str($param);
echo $confirmation; // 1
答案 2 :(得分:1)
输出是因为param
是双重编码的,一次是.serialize()
:
param = jQuery('input')....serialize();
console.log(param);
// "param%5Bconfirmation%5D=1"
而且data:
再次通过$.param()
$.ajax()
运行{/ 1}}:
console.log($.param({
param: param
}));
// "param=param%255Bconfirmation%255D%3D1"
虽然针对$_POST
解码了第一轮编码:
var_dump($_POST['param']);
// string(25) "param%5Bconfirmation%5D=1"
您必须使用parse_str()
手动解码第二轮:
$param = array();
parse_str($_POST['param'], $param);
var_dump($param);
// array(1) { ["confirmation"]=> int(1) }
您还可以尝试通过将param
与其他编码数据连接来避免双重编码:
data: param + '&' + $.param({
action: 'submit_ajax',
email: $('#email').val(),
send_welcome: true,
listId: $('#listid').val()
}),
答案 3 :(得分:0)
%5B是[ %5D是]
您可以在提交
之前使用此功能修复编码function fixedEncodeURI (str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
像这样:
$('#signup_submit').click(function (event){
param = jQuery('input').filter(function() {
return this.name.match(/param/);
}).serialize();
event.preventDefault();
$.ajax({
type: "POST",
url: result.php,
data: {
action: 'submit_ajax',
email: $('#email').val(),
send_welcome: true,
listId: $('#listid').val(),
param: fixedEncodeURI(param)
},
success: function(msg) {
console.log('ok');
}
});
});