如何通过AJAX向PHP脚本发送包含(&)的JSON数据?
解决AJAX传递含特殊字符的JSON字符串到PHP的问题
看起来你遇到的问题是传递包含特殊字符(比如&)的JSON字符串时,PHP无法正确接收完整的data参数,对吧?这是因为手动拼接POST参数的方式导致了参数解析错误,咱们一步步来解决:
问题根源
你在JS里手动拼接了data字符串:
data: 'name=john&data=' + myData,
这里的&在JS字符串里实际会被解析成&,而myData里的test & test最终会变成test & test,拼接后整个请求参数会变成:
name=john&data=[{"label":"test & test"}]
HTTP请求里&是参数分隔符,服务器会把& test后面的部分当成新的参数,导致$_POST['data']只拿到[{"label":"test ,剩下的内容被截断成了无效参数。
解决方案:让jQuery自动处理参数编码
不要手动拼接字符串,改用对象形式传递data,jQuery会自动帮你处理所有特殊字符的URL编码,避免参数被截断:
修改后的JS代码
$(document).on('click', '#my-button', function(){ var myData = '[{"label":"test & test"}]'; $.ajax({ url: 'demo.php', // 注意你写的demp.php大概率是笔误,记得改成实际文件名 type: 'post', data: { name: 'john', data: myData }, dataType: 'json', success: function(json) { console.log('请求成功'); }, error: function(xhr, ajaxOptions, thrownError) { console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); } }); });
对应的PHP代码(无需修改,直接用var_dump($_POST))
这时候PHP的$_POST['data']会拿到完整的JSON字符串,var_dump输出应该是:
array(2) { ["name"]=> string(4) "john" ["data"]=> string(27) "[{"label":"test & test"}]" }
进阶方案:直接传递JSON格式的请求体
如果你想把myData作为真正的JSON数据传递(而不是字符串),可以设置contentType为application/json,然后发送JSON字符串,这时候PHP需要从php://input读取请求体:
修改后的JS代码
$(document).on('click', '#my-button', function(){ // 直接用JS对象再转成JSON,比手动写字符串更规范 var myData = [{label: "test & test"}]; $.ajax({ url: 'demo.php', type: 'post', data: JSON.stringify({ name: 'john', data: myData }), contentType: 'application/json', // 关键:告诉服务器这是JSON数据 dataType: 'json', success: function(json) { console.log('请求成功'); }, error: function(xhr, ajaxOptions, thrownError) { console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); } }); });
对应的PHP代码
// 读取JSON请求体并解析 $jsonData = file_get_contents('php://input'); $postData = json_decode($jsonData, true); var_dump($postData);
这时候输出会是解析后的数组:
array(2) { ["name"]=> string(4) "john" ["data"]=> array(1) { [0]=> array(1) { ["label"]=> string(9) "test & test" } } }
内容的提问来源于stack exchange,提问作者user9139889
相关产品推荐
相关产品推荐

