【问题标题】:How does a PHP page retrieve form data?PHP 页面如何检索表单数据?
【发布时间】:2021-10-22 11:03:48
【问题描述】:

我是 PHP 新手,正在 W3Schools 上参加 PHP 课程。在课程的表单处理部分,我读到有两种处理表单数据的方法:POSTGET。我知道根据使用的方法,会创建一个超全局变量,将数据存储为键值对。并且在目标页面,从这个变量中检索数据(使用$_POST["key"]$_GET["key"])。

但我的问题是:超全局变量($_POST$_GET)存储在哪里?如果它在表单所在的同一页面上,它如何被form 标记的action 属性中指定的另一个目标页面访问?

服务器上的所有页面是否都可以访问同一组这些超全局变量(与我目前认为每个页面都有自己的一组变量相反)?

下面的代码应该让我的问题更清楚:

文件index.php

<html>
<body>

<form action="welcome.php" method="post">
    Name: <input type="text" name="name"><br>
    E-mail: <input type="text" name="email"><br>
    <input type="submit">
</form>

</body>
</html>

文件welcome.php

<html>
<body>

    Welcome <?php echo $_POST["name"]; ?><br>
    Your email address is: <?php echo $_POST["email"]; ?>

</body>
</html>

W3Schools 解释如下:

当用户填写上面的表单并点击提交按钮时,表单数据被发送到一个名为“welcome.php”的 PHP 文件中进行处理。表单数据使用 HTTP POST 方法发送。 要显示提交的数据,您可以简单地回显所有变量。

变量$_POST["name"]$_POST["email"]如何到达welcome.php

【问题讨论】:

  • 帖子通常来自表单。 Get 通常来自 URL 字符串。这就是我一直认为的......
  • 我不这么认为。如果您将某些 _$POST 参数发送到一个脚本,例如first.php,相同的 _$POST 数据不应该暴露给不同的文件(例如 second.php),除非它们彼此 require'ing 或其他东西
  • $_POST 或 $_GET 数组存储在 RAM 中用于页面请求,因此只有请求调用的页面实例才能访问。
  • POST 存储在页面上,GET 存储在您确定要在表单本身上执行操作的页面链接上。
  • @ag_dhruv 可能是因为在一个页面上收集的 POST/GET 数据可能会反过来重新 POST/GET 到下一页。每个页面都有自己的这些超级全局变量的实例。

标签: php html forms


【解决方案1】:

Superglobals 不是指变量的生命周期,而是指可以访问变量的范围。

Session variables可以被其他页面访问。

另外,关于你的评论“如果是这样,second.php如何显示first.php中输入的表单数据?”

first.php 应该将数据保存到数据库中。 second.php 应该从数据库中读取数据。如果您是新手,我建议您将 MySQL 作为数据库。它与 PHP 配合得很好。

【讨论】:

  • 扩展克里斯的回应。 sessionStorage 和 localStorage 都可以用来将数据从一个页面传递到另一个页面。 sessionStorage 只会在本地存储数据,直到您关闭选项卡,而 localStorage 更持久,并将数据无限期地存储在本地计算机上。除非在用户本地机器上特别需要无限期的数据存储,否则应该使用 sessionStorage。
  • 这不涉及数据库。请参考我的最新编辑。
  • @ag_dhruv index.php 将变量发布到 welcome.php。在 index.php 中,您将看到 action 标签。这定义了 index.php 在提交表单时会将其表单变量发送到何处。
【解决方案2】:

当您向 Web 服务器(即 apache、nginx)发送请求时,请求会被解析成片段以供理解。然后,在 PHP 的情况下,请求的文件与请求中的数据一起发送到 PHP 解释器。

在您的示例中,您希望表单向页面welcome.php 发送POST 请求。 (如果您对请求方法 GET/POST/etc 不熟悉,那么 w3schools 对此有一个简单的解释:http://www.w3schools.com/tags/ref_httpmethods.asp)您的表单将方法设置为 post,这可以是 get,但通常不会.如果用户按下标签内的提交按钮,则表单使用method 中设置的方法将请求发送到action 中设置的页面。您的表单将发送POST 请求,其中数据名称为“...”和电子邮件=“...”。

当这个请求到达 PHP 时,发送给它的所有数据都将存储在方法全局变量中。所有的 post 请求都将它们的数据放在 $_POST 中,所有的 get 请求都将它们的数据放在 $_GET 中。

因此,当您提交表单POST 请求时,您的浏览器(Firefox/Chrome)将使用POST 方法请求页面welcome.php,并在该请求中发送数据nameemail .在您的服务器上,PHP 将打开文件 welcome.php 并将数据放入 $_POST 数组中。然后,由于 $_POST 是全局的,welcome.php 中的任何地方都可以访问这个变量。

如果您手动转到页面welcome.php,您将执行GET 请求。通常,发送 post 请求的唯一方法是通过表单。因此,手动转到该页面会将 $_POST 设置为一个空数组。

当我学习 PHP 时,我几乎总是在页面顶部有这些行,所以我知道发生了什么:

<pre><?php print_r($_GET);?></pre>
<pre><?php print_r($_POST);?></pre>

这将以漂亮的格式打印出数组,并且标签将确保它们在浏览器中的格式正确(因为 print_r 使用换行符,浏览器会忽略那些除非在 pre 标签中)。

您还可以将print_rvar_dump 交换以获取有关该变量的更多信息。

这是一个简单的答案,网络技术还有很多其他方法。一旦你对 PHP 有足够的了解,我就会进入像 CakePHP 或 CodeIgniter 这样的框架,这会带走很多细节。不过,首先了解基础知识很重要。

【讨论】:

  • 太棒了。所以,简而言之,index.php 向服务器发送POST 请求,其正文中包含表单数据。服务器打开welcome.php 并将数据放在$_POST 数组中,然后我将其用于echo 数据。我哪里错了吗?
  • @ag_dhruv,从技术上讲,您永远不应该显示/使用原始数据。所以是的,该值在 $_POST 中可用,您应该在显示数据或将其插入数据库之前验证/清理数据。
【解决方案3】:

关于您的编辑:

<form action="welcome.php" method="post">

method="post" 位意味着当用户点击“提交”(或任何触发action="welcome.php")时,将从form 元素中收集数据并作为 POST 数据发送到操作目标——因为它是php 文件,然后您可以通过超全局 $_POST 访问此数据,正如您所指出的。

form 内每个inputs 中的name 属性为发送的POST 数据的每个元素设置键,用户在input 中输入的任何内容都将是相应的值到那个键。

例如,如果用户为name 输入“foo”,为email 输入“bar”,则welcome.php 中的$_POST 数据应如下所示:

Array
(
    [name] => foo
    [email] => bar
)

【讨论】:

  • 太棒了!因此,first.php 中输入的数据存储在 动作目标 welcome.php 的超全局数组 ($_POST) 中。对吗?
  • 我不确定“行动目标”是否是正确的描述,但是,是的,这听起来是正确的。我想如果你把它改成method="get",那么你会在welcome.php(而不是$_POST)中看到这个数据填充在$_GET中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
相关资源
最近更新 更多