什么是PHP表单验证?

PHP表单验证指的是在服务器端对HTML提交的表单信息进行检查,确保数据安全、有效和完整,防止SQL注入或XSS攻击,既是一种有效的防御思想又满足数据处理的合理需求。

怎么验证呢?通常是配合PHP内置函数进行判断:

1. 必填信息不能为空:

<?php 
if(empty($_POST["name"])) {echo "姓名不能为空!"; }//empty()
if(isset($_GET["name"])) {echo "姓名不能为空!"; }//isset()
?>


2. 正则表达式判断电话、邮箱和密码数据合理:

<?php
// 手机号验证
function validatePhone($phone) {
    $phoneRegex = '/^1[3-9]\d{9}$/';
    return preg_match($phoneRegex, $phone) === 1;
}
// 邮箱验证
function validateEmail($email) {
    $emailRegex = '/^[^\s@]+@[^\s@]+\.[^\s@]+$/';
    return preg_match($emailRegex, $email) === 1;
}
// 密码强度验证
function validatePassword($password) {
    // 至少6位,包含字母和数字
    $passwordRegex = '/^(?=.*[A-Za-z])(?=.*\d).{6,}$/';
    return preg_match($passwordRegex, $password) === 1;
}
?>


3. 清理输出数据,防止XSS攻击:

<?php 
/*一般该函数遵循“输入不用输出用”*/
$name = htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');//防止XSS攻击
?>


4. 实际演示一遍PHP表单验证流程:

4. 1 先准备一个test.php,包括html页面,表单填写的三个字段,姓名、电话号码和qq邮箱。

4.2 准备一个error数组用于判断用户的输入状态,及时向用户进行信息填写反馈。

4.3 姓名需要验证不为空。

4.4 电话号码不为空且通过正则表达式进行验证,/^1[3-9]\d{9}$/-中国大陆手机号码格式。

4.5 qq邮箱不为空且通过正则表达式验证:/^\d+@qq\.com$/

4.6 所有输出都要通过htmlspecialchars()函数转html实体,防止XSS攻击。

test.php代码如下:

<?php
// 开启错误显示
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 定义变量和错误信息
$name = $phone = $email = '';
$errors = [];
//处理表单提交(通过HTTP POST获取表单数据)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 1. 获取并清理输入数据
    $name = trim($_POST['name'] ?? '');
    $phone = trim($_POST['phone'] ?? '');
    $email = trim($_POST['email'] ?? '');
    
    // 2. 验证必填字段 - 姓名
    if (empty($name)) {
        $errors['name'] = "姓名不能为空!";
    } 
    
    // 3. 验证手机号
    if (empty($phone)) {
        $errors['phone'] = "手机号不能为空!";
    } elseif (!preg_match('/^1[3-9]\d{9}$/', $phone)) {
        $errors['phone'] = "手机号格式不正确!";
    }
    
    // 4. 验证QQ邮箱
    if (empty($email)) {
        $errors['email'] = "邮箱不能为空!";
    } elseif (!preg_match('/^\d+@qq\.com$/', $email)) {
        $errors['email'] = "请输入正确的QQ邮箱格式!";
    }
    
    // 5. 如果没有错误,处理成功
    if (empty($errors)) {
        $success = "表单提交成功!验证通过!";
        // 这里可以继续处理,如保存到数据库
        
        // 清空表单
        $name = $phone = $email = '';
        $errors = [];
    }
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>PHP表单验证演示</title>
</head>
<body>
    <h2>Dotcpp编程-用户注册表单</h2>
   
    <?php if (isset($success)): ?>
        <div style="color: green;"><?php echo $success; ?></div>
    <?php endif; ?>
   
    <form method="POST" action="">
        <!-- 姓名字段 -->
        <div>
            <label for="name">姓名 *</label><br>
            <input type="text" id="name" name="name" 
                   value="<?php echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8'); ?>">
            <?php if (isset($errors['name'])): ?>
                <div style="color: red;"><?php echo $errors['name']; ?></div>
            <?php endif; ?>
        </div>
        <br>
       
        <!-- 手机号字段 -->
        <div>
            <label for="phone">手机号 *</label><br>
            <input type="text" id="phone" name="phone" 
                   value="<?php echo htmlspecialchars($phone, ENT_QUOTES, 'UTF-8'); ?>">
            <?php if (isset($errors['phone'])): ?>
                <div style="color: red;"><?php echo $errors['phone']; ?></div>
            <?php endif; ?>
        </div>
        <br>
       
        <!-- 邮箱字段 -->
        <div>
            <label for="email">QQ邮箱 *</label><br>
            <input type="email" id="email" name="email" 
                   value="<?php echo htmlspecialchars($email, ENT_QUOTES, 'UTF-8'); ?>">
            <?php if (isset($errors['email'])): ?>
                <div style="color: red;"><?php echo $errors['email']; ?></div>
            <?php endif; ?>
        </div>
        <br>
       
        <button type="submit">提交</button>
    </form>
    <hr>
    <h3>验证规则说明:</h3>
    <ul>
        <li>姓名:不能为空</li>
        <li>手机号:1开头,第二位3-9,共11位数字</li>
        <li>QQ邮箱:数字@qq.com格式</li>
    </ul>
</body>
</html>

在test.php填写表单并提交,PHP脚本会进行表单判断。


总结:一般来说后端必须存在表单验证(确保信息合法有效),前端可以存在表单验证(目的是为了优化用户体验),所以学习PHP表单验证是PHP开发人员的必备技能。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)