lyp111332
V2EX  ›  PHP

php 无法获取客户端传来的值,求大婶

  •  
  •   lyp111332 · Apr 20, 2016 · 6292 views
    This topic created in 3861 days ago, the information mentioned may be changed or developed.
    客户端通过 post 方式发送 json 到服务器,我这里用$_POST 方法接收,但是打印出来却为空。第二种办法我用 file_get_contents("php://input");方式接收,但是我能直接返回 json 给他,但是还是打印不出来。请问下这是怎么回事
    35 replies  •  2016-04-21 10:12:50 +08:00
    zztao
    zztao
    Apr 20, 2016
    1
    $_POST 接受到的参数不是 application/json, 而是 url-encode 。打印可以啊,不过你要变为 json 的话得注意 json_decode 的第二个参数。默认 false 解析为 Object , true 解析为 Array
    lyp111332
    lyp111332
    OP
    Apr 20, 2016
    2
    @zztao 打印不了,客户端那边传过来没有键值对,我这里根本无法打印$_POST[]也就是方括号里面的值不知道是什么, 直接 echo $_POST 也无法打印
    yangqi
    yangqi
    Apr 20, 2016
    3
    @lyp111332 $_POST 是数组,你当然 echo 不了了,你贴点代码吧,这样空说谁知道怎么回事。
    Yiiiii
    Yiiiii
    Apr 20, 2016
    4
    @lyp111332 你使用 php 输入流 试试看 file_get_content('php://input')
    yemoluo
    yemoluo
    Apr 20, 2016
    5
    `file_get_contents('php://input', 'r');`
    qgy18
    qgy18
    Apr 20, 2016 via iPhone
    6
    你可以看下这个:
    https://imququ.com/post/four-ways-to-post-data-in-http.html

    但也有些服务端语言还没有支持这种方式,例如 php 就无法通过 $_POST 对象从上面的请求中获得内容。这时候,需要自己动手处理下:在请求头中 Content-Type 为 application/json 时,从 php://input 里获得原始输入流,再 json_decode 成对象。一些 php 框架已经开始这么做了。
    lyp111332
    lyp111332
    OP
    Apr 20, 2016
    7
    @GTim
    @Yiiiii
    @yangqi 这些使用过了,<?php$c = file_get_contents("php://input");echo ($c);>我这样子打印出来,客户端那边就能收到我打印出来的乱码了,但是我这里网页上显示不出来。 使用 var_dump 打印也一样没有数组为 0
    Delbert
    Delbert
    Apr 20, 2016 via Android
    8
    dump 呢?
    lyp111332
    lyp111332
    OP
    Apr 20, 2016
    9
    @Delbert 一样 完全没有信息显示在网页上 ,我是用谷歌浏览器
    qgy18
    qgy18
    Apr 20, 2016 via iPhone
    10
    抓包看请求有响应没。

    网页不显示,不一定是没数据,如果用 jquery 一类的 ajax 发请求,响应的 content-type 不对也不解析。
    yangqi
    yangqi
    Apr 20, 2016
    11
    @lyp111332 你客户端怎么传数据的?
    server
    server
    Apr 20, 2016
    12
    content-type 问题, php post 只处理 application/x-www-form-urlencoded 。可以参看 laravel yii restful 实现方案。
    lyp111332
    lyp111332
    OP
    Apr 20, 2016
    13
    @yangqi 用 http 协议 post 请求
    tagtag
    tagtag
    Apr 20, 2016
    14
    没太明白你说的意思,他调你因为他给你 post 了,所以他能看到你的 echo ,你自己运行自己代码没传参数,所以啥都没有,不正常吗?
    tagtag
    tagtag
    Apr 20, 2016
    15
    他调你的时候你 error_log 下,或者断点下
    O3YwA1ENkb7i35XJ
    O3YwA1ENkb7i35XJ
    Apr 20, 2016
    16
    @lyp111332 无码无真相,请提供你提交数据至后端的 JS 代码,以及你后端的 php 代码.
    sfree2005
    sfree2005
    Apr 20, 2016
    17
    试下这个: json_decode(urldecode($_POST['data']),true);
    O3YwA1ENkb7i35XJ
    O3YwA1ENkb7i35XJ
    Apr 20, 2016
    18
    @lyp111332 根据你的描述做了一个简单的 Demo, 没发现有什么不能输出的.
    Demo: https://xqin.net/temp/json_test.html

    html 代码:
    ```

    <script src="//js.xqin.net/jquery-1.7.1.min.js" type="text/javascript"></script>
    <script src="//js.xqin.net/jquery.json-2.3.min.js" type="text/javascript"></script>

    <script type="text/javascript">
    $.ajax('json_test.php', {
    type: 'POST',//POST
    contentType : 'application/json',//发送 JSON 格式的数据
    data: $.toJSON({t: Math.random()}),// $.toJSON 在 jquery.json 中定义
    success: function(v){
    alert(v);//输出服务器返回的内容
    }
    });
    </script>
    ```

    php 代码
    ```
    <?php
    echo file_get_contents('php://input');
    ```
    laoyuan
    laoyuan
    Apr 20, 2016
    19
    基本上,我有点看明白了, LZ 一次请求,想在两个地方看到。
    b821025551b
    b821025551b
    Apr 20, 2016
    20
    贴码吧,这样我们怎么猜
    msxcms
    msxcms
    Apr 20, 2016
    21
    Content-Type:application/x-www-form-urlencoded
    realpg
    realpg
    Apr 20, 2016❤️2
    22
    楼上各位,我好想看明白楼主的脑袋里想啥了
    看到了这段代码: echo $_POST ,我觉得首先就不能把事儿想复杂了

    看来看去感觉是这样的:

    楼主写了个:
    http://www.demo.com/recieve.php
    然后他有一个客户端(json,app,服务器推送之类),往
    http://www.demo.com/recieve.php
    POST 了一个 json 参数,然后 recieve.php 会返回一个响应内容给客户端,但是应该是这个协议出了啥问题跟他设想的不一样,他想看这个通信的记录

    于是他用浏览器打开了
    http://www.demo.com/recieve.php
    为啥不显示之前通信的内容呢……
    qq316107934
    qq316107934
    Apr 20, 2016 via Android
    23
    @realpg 我也这么觉得...
    kiwi95
    kiwi95
    Apr 20, 2016
    24
    楼主根本没有懂 POST 的流程,都是自己在猜吧,仔细看看 php 的文档: http://php.net/manual/zh/reserved.variables.post.php
    qdpoboy
    qdpoboy
    Apr 20, 2016
    25
    是在黑 php 嘛 -_-
    Slienc7
    Slienc7
    Apr 20, 2016 via Android
    26
    http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading

    ;;;

    哪里来的习惯喜欢在网页向服务器发送 JSON.
    lyp111332
    lyp111332
    OP
    Apr 20, 2016
    27
    @laoyuan 不是这样的 是客户端发给我一个值,我要接收然后存在数据库中,但是数据库中没有数据显示 ,我就想着先打印客户端发过来的值看看,结果发现打印不出来。
    @qdpoboy
    @kiwi95
    @realpg
    sensui7
    sensui7
    Apr 20, 2016
    28
    @lyp111332 你是不是用的 ajax 啊, 那玩意不能直接在服务端打印,看不到的.
    JiShuTui
    JiShuTui
    Apr 20, 2016
    29
    @lyp111332 你所谓的打印是怎么打印?你又是在哪里查看打印的输出?
    wudanyang
    wudanyang
    Apr 20, 2016
    30
    @lyp111332
    @JiShuTui
    说的对,你是 print_r 还是 var_dump ,打印输出到哪了。

    可以直接输出到日志中
    error_log(print_r($_POST, 1), 3, '/tmp/anyfile.log');
    KomeijiSatori
    KomeijiSatori
    Apr 20, 2016 via Android
    31
    @lyp111332 先检查一下是不是客户端问题......?
    POPOEVER
    POPOEVER
    Apr 20, 2016
    32
    这个乱哟,贴码吧,省得大家陪你瞎猜
    chairuosen
    chairuosen
    Apr 20, 2016
    33
    遇到这种说不清的问题,搭建一个能复现问题的最小 demo ,大家都省事
    audi
    audi
    Apr 20, 2016 via iPhone❤️1
    34
    这种简单的问题建议大家不要浪费时间。第一个楼主问题描述能力不够,第二个基础太差还没有学会走路就想跑。
    icekingcy
    icekingcy
    Apr 21, 2016
    35
    @realpg 看到这个回复 觉得瞬间乐了 哈哈哈哈哈哈
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2107 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 14:21 · PVG 22:21 · LAX 06:21 · JFK 09:21
    ♥ Do have faith in what you're doing.