【问题标题】:Better Understanding of PHP $_POST superglobal更好地理解 PHP $_POST 超全局
【发布时间】:2017-01-07 15:19:16
【问题描述】:

我刚刚开始使用 PHP,我发现无论我在哪里上网,我都找不到任何关于 $_POST 超全局实际工作原理的深入解释。

我了解到 $_POST 超全局是一个可以在脚本中的任何位置访问的关联数组,并且它保存通过发布请求接收到的值。我的问题是:它对网站上的所有 PHP 文件都是通用的吗?如果不是,您如何指定要向网站上的哪个文件发布数据,或将 $_POST 收到的内容传输到另一个文件?在对数据执行某些操作之前,如何制作一个等待数据发送到 $_POST 中的某个索引(即 $_POST["name"])的代码,以便您的代码不会立即将变量设置为等于到前面提到的post index在收到请求之前为null?

我问这些问题是因为我发现虽然我在处理表单时使用 $_POST 没有问题,但是当我从外部发送 post 请求时,我无法使用 $_POST 进行任何操作,例如从像 Fiddler 这样的程序。我尝试将“application/x-www-form-urlencoded”格式的帖子数据发送到由免费网站托管服务托管的测试网站,无论我做什么,我总是以 $_POST["name" 结尾](是的,我发送的数据被正确地写为“name=test”)在我网站上的每个文件中都是 NULL 类型,因此我无法将这个发送的数据存储在我的 SQL 数据库中。

【问题讨论】:

  • 我认为您不想知道 $_POST 在内部是如何工作的。您想知道您的 POST 请求出了什么问题,而如果您不共享任何代码,这是不可能知道的。
  • 你写过重定向规则.htaccess文件吗?

标签: php


【解决方案1】:

它对网站上的所有 PHP 文件都是通用的吗?

当然。如果不是这样,那就没有多大用处了。

你如何指定你想在网站上发布数据的文件

通过让它处理发出请求的 URL

或将 $_POST 收到的内容转移到另一个文件中?

通常由include发送该文件。

如何编写代码,等待数据发送到 $_POST 中的某个索引(即 $_POST["name"]),然后再对数据进行处理

一般来说,你不会。

使用 PHP 的网站不会用 PHP 编写整个 Web 服务器。

你把一个 PHP 脚本放在一个网络服务器上,给它一个 URL。客户端向该 URL 发出 HTTP 请求。网络服务器启动 PHP 程序以响应该请求。当 PHP 程序完成时,它的输出将被发送回客户端。

在表单处理方面我使用 $_POST 没有问题,当我从外部发送 post 请求(例如从 Fiddler 之类的程序)时,我无法使用 $_POST 进行任何操作。

这两种情况绝对没有区别。无论哪种方式,都会向服务器发出 HTTP 请求,该服务器运行 PHP 是响应。

可能是您在尝试手动创建请求时发出了格式错误的请求。

【讨论】:

    【解决方案2】:
    In form declaration should use method post.
    <form name="form_name" action="your file path to post" method="post">
    <input type="text" name="name" value="">
    <input type="submit" name="submit" value="submit">
    </form>
    
    Code for post file
    
    $sql = "insert into table set col = '.$_POST['name'].'";
    mysql_query($sql);
    

    【讨论】:

    【解决方案3】:

    后退一层到 HTTP 请求。每当您与服务器端 PHP 交互时,它都是在 HTTP 请求的上下文中。*“单击链接”会导致向服务器发出 HTTP GET 请求,该请求可能由 PHP 脚本处理。提交表单会导致将 HTTP POST 请求发送到服务器,在那里它可能由 PHP 脚本处理。

    * 除非不是,但我们会忽略不太常见的情况……

    由 PHP 脚本处理的每个请求都会导致一个 PHP 实例运行。它将从请求的任何 .php 文件开始,并且此文件可以在此过程中include/require 更多 .php 文件。所有这些仍然在同一个 HTTP 请求的上下文中运行。无论您echo 还是其他输出,都将作为 HTTP 响应返回。当您的脚本完成并且所有输出都作为响应返回时,PHP 实例将关闭并且脚本执行结束。直到下一个传入的 HTTP 请求……

    任何以application/x-www-form-urlencoded 格式编码的 HTTP 请求(通常使用 POST HTTP 请求)发送的正文数据都将由 PHP 自动解析,并且解析后的数据将可用在$_POST 全局变量中。 此变量/数据在您的整个 PHP 实例的整个生命周期内都可用。它是访问 HTTP 正文数据的便捷 API。一旦 PHP 实例结束,这意味着一旦 HTTP 请求结束,这些数据就会被丢弃。每个请求、每个 PHP 实例的数据都是唯一的。

    如果正文数据不是application/x-www-form-urlencoded 编码的,假设它是JSON 编码的,PHP 无法解析它并且不会填充$_POST。在这种情况下,您需要手动读取和解析正文,例如:

    $body = file_get_contents('php://input');
    $data = json_decode($body);
    

    $_GET 全局变量的工作方式非常相似,但它包含解析后的 URL 查询参数(例如 http://…/example.php?foo=bar&amp;baz=42)。不,它不仅适用于GET HTTP 请求,它适用于所有 HTTP 请求;由于这个变量的命名很糟糕,这是一个常见的误解。

    【讨论】:

    • 谢谢!这清楚了很多。只是一些事情 - 如果一个网站有 2 个文件,index.php 和 extra.php,并且一个发布请求被发送到它的 URL,那么该请求会只被 index.php 接收,还是同时被两个文件接收?并且当实际收到此请求时,php 代码是否会像有人实际尝试在网站上查看它时那样简单地运行自身,除了现在它实际上具有 $_POST["whatever"] 的值?
    • Web 服务器只会执行其中一个文件。它们不能都由 Web 服务器执行。 “其 URL”将指向其中一个文件,而不是两者。为响应 HTTP 请求而执行的文件将具有请求的上下文,这意味着它可以访问$_POST 中的任何 HTTP 正文数据。 – 同样,如果 index.php include 'extra.php',那么 extra.php 也将在相同 HTTP 请求的上下文中运行,并可以访问相同的 $_POST 数据。但是,如果您在没有 POST 数据的情况下向…/extra.php 发出单独的请求,那么显然不会。
    • 所以要将请求发送到 extra.php 而不是 index.php,是否必须将请求定向到“examplesite.com/extra.php”,因为 URL 就是这样显示文件位置的?跨度>
    • 是的。如果要将数据发送到 extra.php,则必须将其发送到 http://…/extra.php。 (您可以配置您的 Web 服务器以将任意 URL 匹配到任意文件,但首先让我们保持简单......)
    • 非常感谢您的帮助!我会看看我现在能做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2016-04-09
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多