zoukankan      html  css  js  c++  java
  • $_POST 和 php://input 的区别

    手册中摘取的几句话:

    1. 当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本。
    2. php://input 是个可以访问请求的原始数据的只读流。 enctype="multipart/form-data" 的时候php://input 是无效的。

    验证下:

    post.html

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
        <form action="getpost.php" method="post">
            <input type="text" name="name" value="saisai">
            <input type="submit" name="submit" value="submit">
        </form>
    </body>
    </html>

     getpost.php

    <?php
        echo "----------input--------<br />";
        var_dump(file_get_contents('php://input', 'r'));
        echo "----------post---------<br />";
        var_dump($_POST);
    ?>

    一、enctype="application/x-www-form-urlencoded"

    请求主体:

    Content-Type: application/x-www-form-urlencoded
    Content-Length: 25
    
    name=saisai&submit=submit

    输出:

    ----------input--------
    
    string 'name=saisai&submit=submit' (length=25)
    
    ----------post---------
    
    array (size=2)
      'name' => string 'saisai' (length=6)
      'submit' => string 'submit' (length=6)

    小结:当enctype="application/x-www-form-urlencoded"时,请求主体(request body)中的数据(name=saisai&submit=submit)转换成关联数组放入$_POST,而 php://input 则获取的是原始数据(raw data)。

    二、enctype=“multipart/form-data”时

    2.1 表单:

        <form action="getpost.php" method="post" enctype="multipart/form-data">
            <input type="text" name="name" value="saisai">
            <input type="submit" name="submit" value="submit">
        </form>

    请求主题:
    Content-Type: multipart/form-data; boundary=---------------------------22554656810024
    Content-Length: 249
    
    -----------------------------22554656810024
    Content-Disposition: form-data; name="name"
    
    saisai
    -----------------------------22554656810024
    Content-Disposition: form-data; name="submit"
    
    submit
    -----------------------------22554656810024--

    输出:
    ----------input--------
    
    string '' (length=0)
    
    ----------post---------
    
    array (size=2)
      'name' => string 'saisai' (length=6)
      'submit' => string 'submit' (length=6)

    小结:在enctype="multipart/form-data" 且没有上传文件控件时,$_POST 能正常打印数据,php:// 无效。

    2.2 表单(添加一个文件上传):

    <form action="getpost.php" method="post" enctype="multipart/form-data">
            <input type="text" name="name" value="saisai">
            <input type="submit" name="submit" value="submit">
     </form>

    请求主题:

    Content-Type: multipart/form-data; boundary=---------------------------272321281228527
    Content-Length: 68386
    
    -----------------------------272321281228527
    Content-Disposition: form-data; name="name"
    
    saisai
    -----------------------------272321281228527
    Content-Disposition: form-data; name="filename"; filename="dog.png"
    Content-Type: image/png
    
                       一堆乱码                    
    -----------------------------272321281228527
    Content-Disposition: form-data; name="submit"
    
    submit
    -----------------------------272321281228527--

    输出:

    ----------input--------
    
    string '' (length=0)
    
    ----------post---------
    
    array (size=2)
      'name' => string 'saisai' (length=6)
      'submit' => string 'submit' (length=6)

    小结:在enctype="multipart/form-data" 且有上传文件控件时,$_POST 能打印出传入的数据,但是排除了上传的任何内容。php:// 无效。

     三、enctype="text/plain"

    表单:

    <form action="getpost.php" method="post" enctype="text/plain">
            <input type="text" name="name" value="saisai">
            
            <input type="submit" name="submit" value="submit">
    </form>

    请求主体:

    Content-Type: text/plain
    Content-Length: 28
    
    name=saisai
    submit=submit

    输出:

    ----------input--------
    
    string 'name=saisai
    
    submit=submit
    
    ' (length=28)
    
    ----------post---------
    
    array (size=0)
      empty

    小结:enctype="text/plain"时,$_POST中没有内容,php://input中以键值对的方式存放。

    总结:

    1. 当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data :php://input 中是形同 a=1&b=2的原始数据。$_POST 中是关联数组,且没有上传控件的内容。
    2. php://input 是个可以访问请求的原始数据的只读流。 enctype="multipart/form-data" 的时候php://input 是无效的。
    3. $_POST 不能获取 Content-Type = "text/plain"时 post的数据, php://input可以。
  • 相关阅读:
    shell 操作钉钉机器人实现告警提醒
    谨慎 mongodb 关于数字操作可能导致类型及精度变化
    数据库如何应对保障大促活动
    SQL Server Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现 -1(服务器视角)
    通过 Telegraf + InfluxDB + Grafana 快速搭建监控体系的详细步骤
    MySQL数据库Inception工具学习与测试 笔记
    MongoDB 中数据的替换方法实现 --类Replace()函数功能
    MongoDB 中的【加减乘除】运算
    MySQL索引设计需要考虑哪些因素?
    关于SQL Server 数据库归档的一些思考和改进
  • 原文地址:https://www.cnblogs.com/natian-ws/p/6705137.html
Copyright © 2011-2022 走看看