PHP 面试考点之表单处理

01-05 8083阅读

在 PHP 开发中,表单处理是一个常见且重要的环节,也是面试中经常会涉及到的考点。下面我们来详细探讨一下。

表单的基本概念

表单是用于收集用户输入数据的 HTML 元素组合。在 PHP 中,我们通过 $_POST$_GET 超全局变量来获取表单提交的数据。例如,一个简单的登录表单:

<form method="post" action="login.php">
    <label for="username">用户名:</label>
    <input type="text" id="username" name="username" required><br>
    <label for="password">密码:</label>
    <input type="password" id="password" name="password" required><br>
    <input type="submit" value="登录">
</form>

login.php 中,我们可以这样获取数据:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST["username"];
    $password = $_POST["password"];
    // 后续进行验证等操作
}
?>

表单验证

客户端验证

HTML5 提供了一些内置的验证属性,如 required(必填)、pattern(正则匹配)等。但客户端验证是不可靠的,因为用户可以禁用 JavaScript 或者绕过前端验证。

服务器端验证

这是非常关键的。以验证用户名是否只包含字母和数字为例:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST["username"];
    if (!preg_match("/^[a-zA-Z0-9]+$/", $username)) {
        echo "用户名只能包含字母和数字";
    } else {
        // 其他处理
    }
}
?>

对于密码强度的验证,我们可以检查长度、包含的字符类型等:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $password = $_POST["password"];
    if (strlen($password) < 8) {
        echo "密码长度至少 8 位";
    } elseif (!preg_match("/[A-Z]/", $password)) {
        echo "密码需包含大写字母";
    } elseif (!preg_match("/[a-z]/", $password)) {
        echo "密码需包含小写字母";
    } elseif (!preg_match("/[0-9]/", $password)) {
        echo "密码需包含数字";
    } else {
        // 其他处理
    }
}
?>

文件上传表单

HTML 表单设置

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

注意 enctype="multipart/form-data" 是文件上传表单必须的属性。

PHP 处理文件上传

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $target_dir = "uploads/";
    $target_file = $target_dir. basename($_FILES["fileToUpload"]["name"]);
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));

    // 检查文件是否为图片
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if ($check === false) {
        echo "文件不是图片";
        $uploadOk = 0;
    }

    // 检查文件大小
    if ($_FILES["fileToUpload"]["size"] > 500000) {
        echo "文件太大";
        $uploadOk = 0;
    }

    // 允许的文件格式
    if ($imageFileType!= "jpg" && $imageFileType!= "png" && $imageFileType!= "jpeg" && $imageFileType!= "gif") {
        echo "只允许 JPG、JPEG、PNG、GIF 格式";
        $uploadOk = 0;
    }

    if ($uploadOk == 1) {
        if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            echo "文件上传成功";
        } else {
            echo "文件上传失败";
        }
    }
}
?>

防止表单重复提交

令牌(Token)方法

  1. 在表单页面生成一个唯一的令牌,并存储在会话中:
    <?php
    session_start();
    $_SESSION['token'] = bin2hex(random_bytes(32));
    ?>
  2. 在表单中添加令牌隐藏字段:
    <input type="hidden" name="token" value="<?php echo $_SESSION['token'];?>">
  3. 在处理表单的页面验证令牌:
    <?php
    session_start();
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if ($_POST['token']!== $_SESSION['token']) {
        echo "无效的请求";
    } else {
        // 处理表单
        unset($_SESSION['token']); // 处理后销毁令牌
    }
    }
    ?>

总结

在 PHP 面试中,关于表单处理,我们需要掌握表单数据的获取($_POST$_GET)、表单验证(客户端和服务器端)、文件上传的处理以及防止表单重复提交等知识点。熟练运用这些技能,能够让我们在开发中构建安全、可靠的表单功能,也能在面试中更好地展示自己的能力。建议在实际项目中多练习这些操作,加深理解和记忆,同时关注最新的 PHP 特性和安全规范,不断提升自己处理表单的水平。

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

目录[+]