V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
yeshang
V2EX  ›  JavaScript

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

  •  
  •   yeshang · 2017-11-10 11:29:53 +08:00 · 2020 次点击
    这是一个创建于 2570 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $('#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);
    ?>
    
    第 1 条附言  ·  2017-11-10 13:12:23 +08:00
    小白 [掩面哭笑]
    问题解决了. 感谢楼下所有朋友的帮助. 非常感谢
    12 条回复    2017-11-10 13:09:34 +08:00
    LeeSeoung
        1
    LeeSeoung  
       2017-11-10 11:35:29 +08:00
    - -为啥不看下 error 报错的 result 是啥?或者直接用 F12。。
    yeshang
        2
    yeshang  
    OP
       2017-11-10 11:56:07 +08:00
    @LeeSeoung result 返回 {"readyState":4,"responseText":"Array\n(\n)\n","status":200,"statusText":"OK"}
    meszyouh
        3
    meszyouh  
       2017-11-10 12:08:33 +08:00
    @yeshang contentType 默认就行了
    yeshang
        4
    yeshang  
    OP
       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
        5
    meszyouh  
       2017-11-10 12:22:44 +08:00
    试试 把 print_r 改成 echo
    EvilCult
        6
    EvilCult  
       2017-11-10 12:28:33 +08:00   ❤️ 1
    我深深的怀疑是这里写错了。
    print_r($_POST); ----------> print_r( json_encode( $_POST ) );
    dangyuluo
        7
    dangyuluo  
       2017-11-10 12:30:28 +08:00
    @EvilCult print_r 就是打印数组的
    dangyuluo
        8
    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
        9
    EvilCult  
       2017-11-10 12:41:22 +08:00
    @dangyuluo 我懂。
    楼主的 ajax 里这一段「 dataType:"json"」,指定预期服务器传输回来的数据是 json。
    然后 PHP 直接 print_r 了一段数组,传输回来是无法解析的。
    我怀疑用开发者工具看一下的话,应该报错的“对象无法解析”还是啥来着??忘了~
    picone
        10
    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
        11
    EvilCult  
       2017-11-10 13:02:19 +08:00
    @picone
    哦对。。多谢指正。
    如此说来,「 contentType:"application/json"」这一段还应该删掉。或者换成「 contentType:"application/x-www-form-urlencoded"」,「 contentType:"multipart/form-data"」
    dd0754
        12
    dd0754  
       2017-11-10 13:09:34 +08:00   ❤️ 1
    js 去掉
    contentType:"application/json",

    php 改为
    echo json_encode($_POST);
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1725 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 16:42 · PVG 00:42 · LAX 08:42 · JFK 11:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.