小白请问 这段 jq ajax 总是无法正常提交数据,请问怎么修改

2017-11-10 11:29:53 +08:00
 yeshang
$('#submit').click(function() {
    event.preventDefault();//使自带的方法失效
    var d = {};
    var t = $('#form').serializeArray();
    $.each(t, function() {
      d[this.name] = this.value;
    });
    var data = JSON.stringify(d);
    $.ajax({
           type: "POST",
           url: "/s/a.php",
           contentType:"application/json",
           data: data,
           dataType:"json",
           success: function(result){
              alert("Data Loaded: " + data);
           },
           error: function(result){
              alert("error" + data);
           },
    });
  });

总是提示 error + 提交的 json 数据. 如何才能让他成功提交

/s/a.php 内容如下:

<?php
    print_r($_POST);
?>
1946 次点击
所在节点    JavaScript
12 条回复
LeeSeoung
2017-11-10 11:35:29 +08:00
- -为啥不看下 error 报错的 result 是啥?或者直接用 F12。。
yeshang
2017-11-10 11:56:07 +08:00
@LeeSeoung result 返回 {"readyState":4,"responseText":"Array\n(\n)\n","status":200,"statusText":"OK"}
meszyouh
2017-11-10 12:08:33 +08:00
@yeshang contentType 默认就行了
yeshang
2017-11-10 12:14:40 +08:00
@meszyouh 把 contentType 这行删了还是不行啊. 提示 error {"readyState":4,"responseText":"Array\n(\n [{\"thing_box_weight\":\"r\",\"box_weight\":\"7\",\"sku\":\"1003416\"}] => \n)\n","status":200,"statusText":"OK"}
meszyouh
2017-11-10 12:22:44 +08:00
试试 把 print_r 改成 echo
EvilCult
2017-11-10 12:28:33 +08:00
我深深的怀疑是这里写错了。
print_r($_POST); ----------> print_r( json_encode( $_POST ) );
dangyuluo
2017-11-10 12:30:28 +08:00
@EvilCult print_r 就是打印数组的
dangyuluo
2017-11-10 12:37:08 +08:00
说实话,虽然我经常用 PHP,但是有时候对别人“ PHP 是最好的语言”这种话没有一点反驳能力,因为平均来讲 PHPer 水平确实不如别人。不过看你说是小白求问,我也不苛责什么,毕竟以前我也在这个问题上困扰过。

首先,网页里有一种东西叫表单,表单 post 数据的形式大致是这样:a=1&b=2&c=3。PHP 能够让你用$_POST 获取里面的 a,b,c 的原理,你可以简单的认为以&分割开,然后等号两侧分别赋值给 key 和 value,然后生成这个数组。

你现在要 post 一个 json 字符串到服务器,肯定是不符合这种格式的,PHP 无法进行解析,然后就返回给你一个空$_POST 数组。你现在如果想在服务器上抓到这个 JSON 字符串,应该用:
```
file_get_contents("php://input")
```
这样才是获取 php 的原始输入值,然后你在 json_decode 就可以了。再提醒你,json_decode 返回的是一个对象,而不是数组。
EvilCult
2017-11-10 12:41:22 +08:00
@dangyuluo 我懂。
楼主的 ajax 里这一段「 dataType:"json"」,指定预期服务器传输回来的数据是 json。
然后 PHP 直接 print_r 了一段数组,传输回来是无法解析的。
我怀疑用开发者工具看一下的话,应该报错的“对象无法解析”还是啥来着??忘了~
picone
2017-11-10 12:46:05 +08:00
@EvilCult #9 问题是在于,$_POST 里面放的只会是 application/x-www-form-urlencoded 或 multipart/form-data 解析的内容。传送门 http://php.net/manual/zh/reserved.variables.post.php
EvilCult
2017-11-10 13:02:19 +08:00
@picone
哦对。。多谢指正。
如此说来,「 contentType:"application/json"」这一段还应该删掉。或者换成「 contentType:"application/x-www-form-urlencoded"」,「 contentType:"multipart/form-data"」
dd0754
2017-11-10 13:09:34 +08:00
js 去掉
contentType:"application/json",

php 改为
echo json_encode($_POST);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/405219

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX