HTML form:用 PHP 示例比较 GET、POST、action 与 name

HTML <form> 将输入控件分组到提交到服务器的表单中。action 选择处理地址,method 选择提交方法。GET 将值放在 URL 查询中,POST 将值放在请求主体中,但 POST 本身并不加密数据。

action、method 和 name 的作用

action 是浏览器请求的地址。如果省略,表单将提交到当前文档地址。默认方法是 get,适用于不改变状态的搜索和检索。创建和更新通常使用 post,并进行服务器端身份验证、授权和请求验证。

控件的 id 用于在文档中识别它并关联其标签;name 是提交的数据键。没有 name 的普通输入会被省略,禁用的控件以及未选中的单选按钮或复选框也会被省略。不要在一个表单内嵌套另一个表单。

准备完整的练习表单

仅打开 HTML 文件不足以检查接收服务器。在本地环境中创建一个空的练习文件夹,并安装 PHP 8.x,然后将下面的两个文件保存到该文件夹中。此示例显示接收到的值;它不会存储数据、发送邮件或修改帐户。

第一个文件是 index.html。第二个提交按钮使用 formmethod,因此可以使用 GET 和 POST 对相同的输入进行比较。

<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>GET 与 POST 表单练习</title>
</head>
<body>
  <h1>比较请求方式</h1>
  <form action="receive.php" method="get">
    <p>
      <label for="query">搜索词</label>
      <input type="text" id="query" name="q" maxlength="80" required>
    </p>
    <p>
      <label for="note">备注</label>
      <textarea id="note" name="note" maxlength="300"></textarea>
    </p>
    <button type="submit">用 GET 查看</button>
    <button type="submit" formmethod="post">用 POST 查看</button>
    <button type="reset">重置</button>
  </form>
</body>
</html>

第二个文件是 receive.php。它从请求方法的输入集合中读取字符串,并拒绝数组或无效长度。输出针对其 HTML 上下文进行了转义。

<?php
declare(strict_types=1);
header('Content-Type: text/html; charset=UTF-8');
$method = $_SERVER['REQUEST_METHOD'];
if ($method !== 'GET' && $method !== 'POST') {
    header('Allow: GET, POST');
    http_response_code(405);
    exit('不支持的请求方式。');
}
$input = $method === 'POST' ? $_POST : $_GET;
$q = $input['q'] ?? '';
$note = $input['note'] ?? '';
if (!is_string($q) || !is_string($note) || trim($q) === '' ||
    strlen($q) > 320 || strlen($note) > 1200) {
    http_response_code(400);
    exit('请检查搜索词和备注字符串。');
}
function h(string $text): string {
    return htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>
<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>接收结果</title>
</head>
<body>
  <h1>接收结果</h1>
  <p>请求方式: <?= h($method) ?></p>
  <p>搜索词: <?= h($q) ?></p>
  <p>备注: <?= h($note) ?></p>
  <p><a href="index.html">返回表单</a></p>
</body>
</html>

HTML maxlength 和服务器长度检查使用不同的度量标准。此服务器示例使用 strlen 限制字节;它并未实现完整的字符计数策略。请根据服务器的实际应用规则验证重要输入。

运行示例并比较 GET 与 POST

在包含两个文件的文件夹中运行此命令并打开 http://127.0.0.1:8000/index.html。如果找不到 php,请检查其安装路径和 PATH 设置。PHP 的内置服务器用于本地开发和练习,而非生产环境。

php -S 127.0.0.1:8000
  1. 提交空的搜索词将被必填验证阻止。
  2. 输入 HTML 作为搜索词,Practice 作为备注,然后使用 GET 提交。URL 查询中包含 q 和 note,响应显示 GET 作为方法。
  3. 返回表单并输入相同的值,然后使用 POST 提交。输入值不会附加到 URL,响应显示 POST。开发者工具可以在网络面板中查看请求体。
  4. 在备注中提交 <b>Practice</b>,响应会把标签作为文字显示,而不会显示成粗体。练习结束后,在终端按 Ctrl+C 停止服务器。

检查提交方法、安全性和常见错误

POST 内容在开发者工具和服务器上仍然可见;需要 HTTPS 来保护传输中的数据。GET 查询可能会保留在地址、历史记录或日志中,因此不要在其中放置敏感值,如密码。HTML 的 required 和 maxlength 检查可以帮助用户,但不能替代服务器端验证。

文件上传表单通常需要 method="post" 和 enctype="multipart/form-data"。默认编码是 application/x-www-form-urlencoded。实际的文件处理还需要大小、类型和存储位置的检查,超出了此字符串输入练习的范围。

对于 404 响应,请检查相对操作路径和文件名。对于缺失的值,请检查名称以及服务器是否读取了针对正确请求方法的集合。为普通操作按钮明确设置 type="button" 以避免意外提交。重置会恢复原始默认值,而不是总是将字段置空。请参阅 MDN 表单参考 以及 PHP 表单教程。