V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lyp111332
V2EX  ›  PHP

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

  •  
  •   lyp111332 · 2016-04-20 09:02:42 +08:00 · 4906 次点击
    这是一个创建于 3139 天前的主题,其中的信息可能已经有所发展或是发生改变。
    客户端通过 post 方式发送 json 到服务器,我这里用$_POST 方法接收,但是打印出来却为空。第二种办法我用 file_get_contents("php://input");方式接收,但是我能直接返回 json 给他,但是还是打印不出来。请问下这是怎么回事
    35 条回复    2016-04-21 10:12:50 +08:00
    zztao
        1
    zztao  
       2016-04-20 09:06:32 +08:00
    $_POST 接受到的参数不是 application/json, 而是 url-encode 。打印可以啊,不过你要变为 json 的话得注意 json_decode 的第二个参数。默认 false 解析为 Object , true 解析为 Array
    lyp111332
        2
    lyp111332  
    OP
       2016-04-20 09:13:54 +08:00
    @zztao 打印不了,客户端那边传过来没有键值对,我这里根本无法打印$_POST[]也就是方括号里面的值不知道是什么, 直接 echo $_POST 也无法打印
    yangqi
        3
    yangqi  
       2016-04-20 09:16:56 +08:00
    @lyp111332 $_POST 是数组,你当然 echo 不了了,你贴点代码吧,这样空说谁知道怎么回事。
    Yiiiii
        4
    Yiiiii  
       2016-04-20 09:18:21 +08:00
    @lyp111332 你使用 php 输入流 试试看 file_get_content('php://input')
    GTim
        5
    GTim  
       2016-04-20 09:19:37 +08:00
    `file_get_contents('php://input', 'r');`
    qgy18
        6
    qgy18  
       2016-04-20 09:29:37 +08:00 via iPhone
    你可以看下这个:
    https://imququ.com/post/four-ways-to-post-data-in-http.html

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

    网页不显示,不一定是没数据,如果用 jquery 一类的 ajax 发请求,响应的 content-type 不对也不解析。
    yangqi
        11
    yangqi  
       2016-04-20 09:46:16 +08:00
    @lyp111332 你客户端怎么传数据的?
    server
        12
    server  
       2016-04-20 09:48:21 +08:00
    content-type 问题, php post 只处理 application/x-www-form-urlencoded 。可以参看 laravel yii restful 实现方案。
    lyp111332
        13
    lyp111332  
    OP
       2016-04-20 09:49:23 +08:00
    @yangqi 用 http 协议 post 请求
    tagtag
        14
    tagtag  
       2016-04-20 09:58:25 +08:00
    没太明白你说的意思,他调你因为他给你 post 了,所以他能看到你的 echo ,你自己运行自己代码没传参数,所以啥都没有,不正常吗?
    tagtag
        15
    tagtag  
       2016-04-20 09:59:19 +08:00
    他调你的时候你 error_log 下,或者断点下
    xqin
        16
    xqin  
       2016-04-20 10:04:29 +08:00
    @lyp111332 无码无真相,请提供你提交数据至后端的 JS 代码,以及你后端的 php 代码.
    sfree2005
        17
    sfree2005  
       2016-04-20 10:25:00 +08:00
    试下这个: json_decode(urldecode($_POST['data']),true);
    xqin
        18
    xqin  
       2016-04-20 10:32:16 +08:00
    @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
        19
    laoyuan  
       2016-04-20 10:40:07 +08:00
    基本上,我有点看明白了, LZ 一次请求,想在两个地方看到。
    b821025551b
        20
    b821025551b  
       2016-04-20 11:05:49 +08:00
    贴码吧,这样我们怎么猜
    msxcms
        21
    msxcms  
       2016-04-20 11:13:59 +08:00
    Content-Type:application/x-www-form-urlencoded
    realpg
        22
    realpg  
       2016-04-20 11:35:23 +08:00   ❤️ 2
    楼上各位,我好想看明白楼主的脑袋里想啥了
    看到了这段代码: 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
        23
    qq316107934  
       2016-04-20 12:05:51 +08:00 via Android
    @realpg 我也这么觉得...
    kiwi95
        24
    kiwi95  
       2016-04-20 12:08:12 +08:00
    楼主根本没有懂 POST 的流程,都是自己在猜吧,仔细看看 php 的文档: http://php.net/manual/zh/reserved.variables.post.php
    qdpoboy
        25
    qdpoboy  
       2016-04-20 12:59:54 +08:00
    是在黑 php 嘛 -_-
    Slienc7
        26
    Slienc7  
       2016-04-20 14:15:15 +08:00 via Android
    http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading

    ;;;

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

    可以直接输出到日志中
    error_log(print_r($_POST, 1), 3, '/tmp/anyfile.log');
    KomeijiSatori
        31
    KomeijiSatori  
       2016-04-20 17:49:59 +08:00 via Android
    @lyp111332 先检查一下是不是客户端问题......?
    POPOEVER
        32
    POPOEVER  
       2016-04-20 17:57:01 +08:00
    这个乱哟,贴码吧,省得大家陪你瞎猜
    chairuosen
        33
    chairuosen  
       2016-04-20 18:23:12 +08:00
    遇到这种说不清的问题,搭建一个能复现问题的最小 demo ,大家都省事
    audi
        34
    audi  
       2016-04-20 18:25:40 +08:00 via iPhone   ❤️ 1
    这种简单的问题建议大家不要浪费时间。第一个楼主问题描述能力不够,第二个基础太差还没有学会走路就想跑。
    icekingcy
        35
    icekingcy  
       2016-04-21 10:12:50 +08:00
    @realpg 看到这个回复 觉得瞬间乐了 哈哈哈哈哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   988 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:44 · PVG 03:44 · LAX 11:44 · JFK 14:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.