我是 PHP 新手,正在学习 W3Schools 上的 PHP 课程。在课程的表单处理部分,我读到有两种处理表单数据的方法:POST和GET。据我所知,根据所使用的方法,会创建一个超级全局变量,它将数据存储为键值对。在目标页面,从该变量检索数据(使用
$_POST["key"]
或 $_GET["key"]
)。
但我的问题是:超全局变量(
$_POST
或$_GET
)存储在哪里?如果它位于表单所在的同一页面上,则如何由 action
标记的 form
属性中指定的另一个目标页面访问它?
服务器上的所有页面是否都可以访问相同的一组超全局变量(与我目前认为每个页面都有自己的一组变量相反)?
下面的代码应该让我的问题更清楚:
<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>
<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?
当您向 Web 服务器(即 apache、nginx)发送请求时,请求会被解析为可以理解的片段。然后,在 PHP 的情况下,请求的文件将连同请求中的数据发送到 PHP 解释器。
在您的示例中,您需要一个表单来向页面发送 POST 请求
welcome.php
。 (如果您不熟悉请求方法 GET/POST/etc,那么 w3schools 对此有一个简单的解释:http://www.w3schools.com/tags/ref_httpmethods.asp)您的表单将方法设置为 post
,这可能是 get
,但通常不会。如果用户按下标签内的提交按钮,则表单将使用 action
中设置的方法将请求发送到 method
中设置的页面。您的表单将发送一个 POST
请求,其中包含数据名称 =“...”和电子邮件 =“...”。
当这个请求到达PHP时,发送给它的所有数据都将存储在方法全局变量中。所有 post 请求都将数据放在 $_POST 中,所有 get 请求都将数据放在 $_GET 中。
因此,当您提交表单
POST
请求时,您的浏览器 (Firefox/Chrome) 将使用方法 welcome.php
请求页面 POST
,并在该请求中发送数据 name
和 email
。在您的服务器上,PHP 将打开文件 welcome.php
并将数据放入 $_POST 数组中。然后,由于 $_POST 是全局的,因此 welcome.php
内的任何位置都可以访问此变量。
如果您手动转到页面
welcome.php
,您将执行GET
请求。一般来说,发送帖子请求的唯一方法是通过表单。因此手动转到该页面会将 $_POST 设置为空数组。
当我学习 PHP 时,我几乎总是在页面顶部显示这些行,这样我就知道发生了什么:
<pre><?php print_r($_GET);?></pre>
<pre><?php print_r($_POST);?></pre>
这将以漂亮的格式打印出数组,并且标签将确保它们在浏览器中格式正确(因为 print_r 使用换行符,浏览器会忽略这些字符,除非在 pre 标签中)。
您还可以将
print_r
与 var_dump
交换以获取有关该变量的更多信息。
这是一个简单的答案,网络技术还有更多内容。一旦你足够了解 PHP,我就会转向像 CakePHP 或 CodeIgniter 这样的框架,它们会带走很多细节。不过,首先了解基础知识很重要。
关于您的编辑:
<form action="welcome.php" method="post">
method="post"
位意味着当用户点击“提交”(或任何触发器action="welcome.php"
)时,将从form
元素收集数据并将其作为POST数据发送到操作目标——因为它是一个php文件,然后您可以通过超全局 $_POST
访问此数据,正如您所注意到的。
name
内每个input
中的form
属性为发送的POST数据的每个元素设置键,用户在input
中输入的任何内容都将是与该元素相对应的值关键。
例如,如果用户为
name
输入“foo”,为 email
输入“bar”,则 $_POST
中的 welcome.php
数据应类似于:
Array
(
[name] => foo
[email] => bar
)