PHP 简明教程

PHP 表单处理

1. PHP - 简单的 HTML 表单

PHP 的超全局变量 $_GET$_POST 被广泛用于收集表单数据。

下面的示例展示了一个包含两个输入字段和一个提交按钮的简单 HTML 表单:

示例
使用 method="post" 的 HTML 表单:

<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>

当用户填写上述表单并点击提交按钮时,表单数据会通过 HTTP POST 方法被发送到一个名为 "welcome.php" 的 PHP 文件中进行处理。

若要显示已提交的数据,你可以直接输出(echo)对应的变量。

"welcome.php" 文件的代码如下:

<html>
<body>

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

</body>
</html>

其输出结果可能如下所示:

Welcome John
Your email address is john.doe@example.com

使用 HTTP GET 方法也可以实现完全相同的结果:

示例
与上文相同的表单,但将提交方法设置为 "get" 而不是 "post":

<html>
<body>

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

</body>
</html>

对应的 "welcome_get.php" 文件代码如下:

<html>
<body>

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

</body>
</html>

上述代码演示了基础的表单提交流程,但不包含任何表单验证逻辑

为了保护系统免受恶意代码的注入与破坏,必须对所有接收到的表单数据进行严格验证!

在处理 PHP 表单时,请务必将“安全性”放在首位!
本页面的内容旨在演示如何发送和接收表单数据,暂未涉及表单验证。在实际的开发应用中,对表单数据进行正确的安全验证是防御黑客和垃圾邮件攻击的关键防线。

2. GET 与 POST 的对比

无论是 GET 还是 POST,都会在 PHP 中创建一个数组(例如 array( key1 => value1, key2 => value2, key3 => value3, ...))。这个数组包含了表单提交的键值对,其中“键”是 HTML 表单控件的 name 属性值,“值”则是用户输入的数据。

GET 和 POST 对应于 PHP 内部的 $_GET$_POST。它们都属于超全局变量(Superglobals),这意味着它们的作用域是全局的——开发者可以在任何函数、类或文件中直接访问它们,而无需进行任何特殊的声明或操作。

  • $_GET:一个包含通过 URL 查询字符串(Query Parameters)传递给当前脚本的所有变量的数组。
  • $_POST:一个包含通过 HTTP POST 请求主体(Body)传递给当前脚本的所有变量的数组。

2.1 何时使用 GET?

通过 GET 方法发送的表单信息对所有人可见(所有的变量名和具体值都会直接暴露在浏览器 URL 中)。此外,GET 方法对传输的数据量存在严格限制,最大长度通常在 2000 个字符左右。

然而,由于所有的变量都被包含在 URL 中,用户可以方便地将当前带有特定参数的页面加入书签,这在页面分享或保存特定查询状态时非常实用。

GET 仅适用于发送非敏感的常规数据。

注意: 绝对不要使用 GET 方法来传输密码或任何涉及隐私的敏感信息!

2.2 何时使用 POST?

通过 POST 方法发送的表单信息对外部是不可见的(所有的名称和值都被安全地封装在 HTTP 请求的主体中),并且 POST 对传输的数据量没有硬性限制

此外,POST 还支持更高级的网络功能,例如支持在向服务器上传文件时使用的多部分二进制数据传输(multi-part binary input)。

不过,由于变量数据不再显式地暴露在 URL 中,因此无法将该操作结果页面直接加入书签。

在绝大多数情况下,开发人员更倾向于使用 POST 来发送和处理表单数据。