PHP 表单和用户输入
                           
天天向上
发布: 2025-03-19 22:00:26

原创
308 人浏览过

在 Web 开发中,表单(Forms)是用户与服务器交互的主要方式之一,PHP 负责处理用户输入数据。


1️⃣ HTML 表单基础

PHP 使用 $_GET$_POST 变量获取用户输入。
HTML 表单示例:

<form action="process.php" method="post">
    <label for="name">姓名:</label>
    <input type="text" name="name" id="name" required>

    <label for="email">邮箱:</label>
    <input type="email" name="email" id="email" required>

    <input type="submit" value="提交">
</form>

解释

  • action="process.php":表单提交到 process.php 处理。
  • method="post":使用 POST 方法提交数据。
  • required:字段不能为空。

2️⃣ 使用 $_POST 处理表单数据

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $name = $_POST['name'];
    $email = $_POST['email'];

    echo "姓名: " . htmlspecialchars($name) . "<br>";
    echo "邮箱: " . htmlspecialchars($email);
}
?>

解释

  • $_POST['name'] 获取表单 name 输入值。
  • htmlspecialchars() 防止 XSS(跨站脚本攻击)
  • $_SERVER["REQUEST_METHOD"] == "POST" 确保数据是通过 POST 方式提交。

3️⃣ 使用 $_GET 处理 URL 传参

<a href="process.php?name=Tom&email=tom@example.com">点击查看信息</a>
<?php
if ($_SERVER["REQUEST_METHOD"] == "GET") {
    if (isset($_GET['name']) && isset($_GET['email'])) {
        echo "姓名: " . htmlspecialchars($_GET['name']) . "<br>";
        echo "邮箱: " . htmlspecialchars($_GET['email']);
    } else {
        echo "缺少参数!";
    }
}
?>

解释

  • $_GET['name'] 通过 URL 传参。
  • 适用于 查询数据,如搜索引擎。

4️⃣ 表单数据验证

表单数据必须经过验证,以防止 SQL 注入、XSS 攻击、非法输入等

📌 过滤非法输入

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $name = trim($_POST['name']);
    $email = trim($_POST['email']);

    if (empty($name) || empty($email)) {
        die("姓名和邮箱不能为空!");
    }

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        die("无效的邮箱格式!");
    }

    echo "姓名: " . htmlspecialchars($name) . "<br>";
    echo "邮箱: " . htmlspecialchars($email);
}
?>

安全处理

  • trim() 去除首尾空格。
  • empty() 判断是否为空。
  • filter_var($email, FILTER_VALIDATE_EMAIL) 确保邮箱格式正确。
  • htmlspecialchars() 防止 XSS。

5️⃣ $_REQUEST 变量

$_REQUEST 结合 $_GET$_POST,但不推荐用于敏感数据

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $name = $_REQUEST['name'] ?? '匿名';
    echo "姓名: " . htmlspecialchars($name);
}
?>

说明

  • $_REQUEST['name'] ?? '匿名':如果 name 为空,默认值为 匿名

6️⃣ 防止表单重复提交

用户刷新页面时,可能会导致表单重复提交,可以使用 header() 重定向 解决:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $name = htmlspecialchars($_POST['name']);
    echo "提交成功,姓名:" . $name;

    // 避免表单重复提交
    header("Location: success.php");
    exit;
}
?>

header("Location: success.php") 让用户跳转到 success.php,防止重复提交。


7️⃣ 文件上传

📌 HTML 文件上传表单

<form action="upload.php" method="post" enctype="multipart/form-data">
    <label for="file">上传文件:</label>
    <input type="file" name="file" id="file">
    <input type="submit" value="上传">
</form>

📌 处理上传

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (isset($_FILES["file"]) && $_FILES["file"]["error"] == 0) {
        $allowedTypes = ["image/jpeg", "image/png", "image/gif"];
        $fileType = $_FILES["file"]["type"];

        if (!in_array($fileType, $allowedTypes)) {
            die("仅支持 JPG、PNG 和 GIF 格式!");
        }

        $uploadDir = "uploads/";
        $filePath = $uploadDir . basename($_FILES["file"]["name"]);

        if (move_uploaded_file($_FILES["file"]["tmp_name"], $filePath)) {
            echo "文件上传成功: " . $filePath;
        } else {
            echo "文件上传失败!";
        }
    } else {
        echo "请选择文件!";
    }
}
?>

说明

  • $_FILES["file"]["error"] == 0 确保无错误。
  • in_array($fileType, $allowedTypes) 限制文件格式。
  • move_uploaded_file() 移动文件到 uploads/ 目录。

8️⃣ 防止 CSRF(跨站请求伪造)

📌 生成 CSRF 令牌

<?php
session_start();
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
?>
<form action="process.php" method="post">
    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
    <input type="text" name="name">
    <input type="submit" value="提交">
</form>

📌 验证 CSRF 令牌

<?php
session_start();
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die("非法请求!");
    }
    echo "安全提交";
}
?>

说明

  • $_SESSION['csrf_token'] 生成安全令牌。
  • 验证令牌,确保请求来自合法页面。

🔟 总结

功能方法
处理表单数据$_POST['name']$_GET['name']
过滤输入htmlspecialchars()filter_var()
验证邮箱FILTER_VALIDATE_EMAIL
防止重复提交header("Location: success.php")
文件上传move_uploaded_file()
防止 CSRF令牌验证

📌 推荐阅读

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *