• $_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可以。
  • 相关阅读:
    mysql 无法连接提示 Authentication plugin &#39;caching_sha2_password&#39; cannot be loaded
    探究分析:快速对大量的数据转换为数组
    SQL Server like 字段
    InfluxDB从原理到实战
    Python学习日记(四十) Mysql数据库篇 八
    MySQL数据库基本操作
    ES入门宝典(详细截图版)
    NameNode &amp;&amp; Secondary NameNode工作机制
    MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)
    mysql单个表拆分成多个表
  • 原文地址:https://www.cnblogs.com/natian-ws/p/6705137.html
Copyright © 2020-2023  润新知