You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PHP自定义函数返回表单校验错误并显示到HTML标签

核心问题说明

你现有代码无法正常显示错误,是三个基础语法/逻辑问题导致的:

  • 变量作用域不匹配:validation函数内部使用的$errors、$mail_error是函数私有局部变量,和外部定义的同名变量互不连通;且函数执行后返回的结果你没有用变量接收,HTML里直接输出的$final根本没有被赋值。
  • 变量未初始化:$mail_error没有提前设置默认空值,没触发邮箱格式错误时,拼接提示字符串会报"变量未定义"的PHP警告。
  • 冗余代码问题:提交按钮重复写了两次class属性,会导致Bootstrap样式加载异常;且提交失败后用户之前输入的内容会全部清空,体验很差。

可直接运行的修正代码

PHP逻辑部分

<?php
// 提前初始化所有输出用的变量,避免未提交表单时报变量不存在警告
$error_msg = "";
// 初始化表单数据数组,用于提交失败后回填用户输入
$form_fill = [
    'fname' => '',
    'femail' => '',
    'fmessage' => ''
];

/**
 * 表单校验函数
 * @param array $data 接收的表单数据
 * @return array 错误信息列表
 */
function validation($data) {
    $errors = [];
    // 对输入做trim去首尾空格,避免用户输入全空格绕过空校验
    if (empty(trim($data['fname']))) {
        $errors[] = "姓名";
    }
    if (empty(trim($data['femail']))) {
        $errors[] = "邮箱";
    } else if (!filter_var($data['femail'], FILTER_VALIDATE_EMAIL)) {
        $errors[] = "邮箱格式不正确";
    }
    if (empty(trim($data['fmessage']))) {
        $errors[] = "留言内容";
    }
    return $errors;
}

// 表单提交逻辑
if (isset($_POST["submit"])) {
    // 接收表单参数,用htmlspecialchars转义特殊字符,避免XSS漏洞
    $form_fill['fname'] = htmlspecialchars(trim($_POST["fname"]));
    $form_fill['femail'] = htmlspecialchars(trim($_POST["femail"]));
    $form_fill['fmessage'] = htmlspecialchars(trim($_POST["fmessage"]));

    // 调用校验函数,接收返回的错误列表
    $check_result = validation($form_fill);
    if (!empty($check_result)) {
        // 拼接最终错误提示
        $error_msg = implode("、", $check_result) . " 不能为空或不符合规则,请检查后重新提交";
    } else {
        // 校验通过后在这里写你的邮件发送逻辑即可
        // 示例:mail($to, $subject, $content, $headers);
        $error_msg = "提交成功,邮件已发送";
    }
}
?>

HTML表单部分

<form name="main-form" action="" method="post" class="row g-3 pt-1 p-5 bg-custom">
    <div class="input-group mb-3 col-md-6">
        <span class="input-group-text">Name</span>
        <input name="fname" type="text" class="form-control me-3" placeholder="Name" aria-label="Name" value="<?php echo $form_fill['fname']; ?>">
        <span class="input-group-text">E-Mail</span>
        <input name="femail" type="email" class="form-control" placeholder="example@mail.com" aria-label="example@mail.com" value="<?php echo $form_fill['femail']; ?>">
    </div>
    <div class="input-group mb-3 col-md-12 col-sm-6">
        <span class="input-group-text">Message</span>
        <textarea name="fmessage" type="text" class="form-control"><?php echo $form_fill['fmessage']; ?></textarea>
    </div>
    <!-- 错误信息展示位:只有存在提示内容时才渲染标签 -->
    <?php if (!empty($error_msg)): ?>
    <p id="error-message" class="text-center text-danger"><?php echo $error_msg; ?></p>
    <?php endif; ?>
    <div class="col-md-12 text-center">
        <button class="btn btn-primary me-2" id="btn-send" style="width: 30%;" type="submit" name="submit">Send</button>
    </div>
</form>

额外注意点
  • PHP函数内访问外部变量必须通过传参、use关键字(闭包场景)或者global声明,新手最容易踩作用域的坑,不建议滥用global,传参是最清晰可维护的写法。
  • 所有要输出到HTML的用户输入内容,都要用htmlspecialchars()做转义,避免用户输入恶意脚本造成安全问题。
  • 如果需要给每个输入框单独显示对应错误,可以把校验函数返回的错误数组改成键值对形式(键对应字段名,值对应错误提示),在每个输入框下方单独判断输出即可。

内容的提问来源于stack exchange,提问作者Sxvxgx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 00:45:39