You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP表单错误信息无法在原页面显示问题求助

解决表单提交跳转后无法在原页面显示PHP错误的问题

你的核心问题是表单提交后跳转到了contact_mail.php,导致原页面form.php无法获取并显示错误信息。要在原页面展示错误,我们有两种实用方案,下面分别详细说明:


方案1:将处理逻辑与表单合并到同一文件(form.php)

这是最直接的方案,把表单验证、邮件发送逻辑和表单本身放在同一个文件里,提交后不会跳转,直接在当前页面处理并反馈结果。

修改后的完整form.php代码

<?php
$errors = array();
$successMessage = '';

// 表单提交处理逻辑
if (isset($_POST['submit'])) {
    // 字段验证规则
    if (empty($_POST['name_co'])) $errors['name_co'] = 'Name is required.';
    if (empty($_POST['email_co'])) $errors['email_co'] = 'Email is required.';
    if (empty($_POST['mobile'])) {
        $errors['mobile'] = 'Mobile no is required.';
    } else if(strlen((string)$_POST['mobile']) < 10){
        $errors['mobile'] = 'Please enter a valid Mobile No.';
    }
    if (empty($_POST['comments_co'])) $errors['comments_co'] = 'Comments is required.';
    if (empty($_POST['value_num'])) {
        $errors['value_num'] = 'Human Test is required.';
    } else if ($_POST['captcha_num_hidden_contact'] != $_POST['value_num']) {
        $errors['captcha_num_hidden_contact'] = 'Please enter the correct result.';
    }

    // 无错误时处理邮件发送
    if (empty($errors)) {
        $email_subject1 = 'Acknowledgement';
        $headers1 = "MIME-Version: 1.0\n";
        $headers1 .= "Content-type: text/html; charset=iso-8859-1" . "\n";
        $headers1 .= "From: your-email@example.com\n"; // 替换为你的发件邮箱
        
        // 补充邮件内容(原代码中$message1未定义)
        $message1 = "<p>Hi {$_POST['name_co']},<br>Thank you for your query! We will get back to you shortly.</p>";
        $mailstatus1 = mail($_POST['email_co'], $email_subject1, $message1, $headers1);
        
        // 设置成功提示,可选清空表单
        $successMessage = 'Your Query has been successfully submitted. We will contact you very soon!!';
        $_POST = array(); // 清空POST数据,重置表单
    }
}

// 生成验证码(每次加载页面都会生成新的)
$a_con=rand(0,9);
$b_con=rand(0,9);
?>

<!-- 表单HTML部分 -->
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="contact_Form" id="contactform">
    <div class="row">
        <div class="col-md-12 page_subtitle">Get in Touch</div>
    </div>

    <!-- 显示成功提示 -->
    <?php if (!empty($successMessage)): ?>
        <div class="alert alert-success mt-2"><?php echo $successMessage; ?></div>
    <?php endif; ?>

    <div class="row mt-30">
        <div class="col-md-12 form-group">
            <input type="text" 
                   value="<?php echo isset($_POST['name_co']) ? htmlspecialchars($_POST['name_co']) : ''; ?>" 
                   placeholder="Name" 
                   class="form-control <?php echo isset($errors['name_co']) ? 'is-invalid' : ''; ?>" 
                   name="name_co" >
            <?php if (isset($errors['name_co'])): ?>
                <div class="invalid-feedback"><?php echo $errors['name_co']; ?></div>
            <?php endif; ?>
        </div>
    </div>

    <div class="row">
        <div class="col-md-6 form-group">
            <input type="text" 
                   id="txtEmail" 
                   value="<?php echo isset($_POST['email_co']) ? htmlspecialchars($_POST['email_co']) : ''; ?>" 
                   placeholder="Email ID" 
                   class="form-control <?php echo isset($errors['email_co']) ? 'is-invalid' : ''; ?>" 
                   name="email_co" 
                   pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$" 
                   required >
            <?php if (isset($errors['email_co'])): ?>
                <div class="invalid-feedback"><?php echo $errors['email_co']; ?></div>
            <?php endif; ?>
        </div>
        <div class="col-md-6 form-group">
            <input type="text" 
                   value="<?php echo isset($_POST['mobile']) ? htmlspecialchars($_POST['mobile']) : ''; ?>" 
                   placeholder="Phone Number" 
                   class="form-control <?php echo isset($errors['mobile']) ? 'is-invalid' : ''; ?>" 
                   name="mobile" 
                   pattern="[789][0-9]{9}" 
                   required >
            <?php if (isset($errors['mobile'])): ?>
                <div class="invalid-feedback"><?php echo $errors['mobile']; ?></div>
            <?php endif; ?>
        </div>
    </div>

    <div class="row">
        <div class="col-md-12 form-group">
            <textarea cols="45" 
                      rows="6" 
                      placeholder="Message" 
                      class="form-control <?php echo isset($errors['comments_co']) ? 'is-invalid' : ''; ?>" 
                      name="comments_co" 
                      required><?php echo isset($_POST['comments_co']) ? htmlspecialchars($_POST['comments_co']) : ''; ?></textarea>
            <?php if (isset($errors['comments_co'])): ?>
                <div class="invalid-feedback"><?php echo $errors['comments_co']; ?></div>
            <?php endif; ?>
        </div>
    </div>

    <div class="row">
        <div class="col-md-12 form-group">
            Human Test <?php echo $a_con." + ".$b_con?> = 
        </div>
    </div>

    <div class="row">
        <div class="col-md-12 form-group">
            <input type="text" 
                   value="<?php echo isset($_POST['value_num']) ? htmlspecialchars($_POST['value_num']) : ''; ?>" 
                   placeholder="Human Test" 
                   class="form-control <?php echo isset($errors['value_num']) || isset($errors['captcha_num_hidden_contact']) ? 'is-invalid' : ''; ?>" 
                   name="value_num" 
                   required>
            <input class="input" name="captcha_num_hidden_contact" id="captcha_num_hidden_contact" type="hidden" value="<?php echo $a_con+$b_con;?>">
            <?php if (isset($errors['value_num'])): ?>
                <div class="invalid-feedback"><?php echo $errors['value_num']; ?></div>
            <?php endif; ?>
            <?php if (isset($errors['captcha_num_hidden_contact'])): ?>
                <div class="invalid-feedback"><?php echo $errors['captcha_num_hidden_contact']; ?></div>
            <?php endif; ?>
        </div>
    </div>

    <div class="row">
        <div class="col-md-12 form-group">
            <input type="submit" name="submit" class="btn btn-submit" />
        </div>
    </div>
</form>

关键改动说明

  1. 合并逻辑到同一文件:把contact_mail.php的验证和邮件代码移到form.php顶部,提交后不会跳转。
  2. 保留用户输入:用htmlspecialchars($_POST['字段名'])在输入框中保留用户已填内容,避免重复输入。
  3. 优化错误显示:用Bootstrap的is-invalidinvalid-feedback类(如果不用Bootstrap可以自定义样式),把错误信息显示在输入框下方,不再覆盖用户输入。
  4. 成功提示展示:提交成功后在表单上方显示友好提示,可选清空表单重置。
  5. 验证码动态生成:确保每次加载页面(包括提交后)都会生成新的验证码。

方案2:AJAX异步提交(无刷新体验)

如果想要完全无刷新的交互体验,可以用JavaScript发送AJAX请求,提交数据到contact_mail.php,然后动态在原页面显示错误或成功信息。

步骤1:修改form.php的表单

<form action="" method="post" name="contact_Form" id="contactform">
    <!-- 表单内容和之前一致,无需修改 -->
</form>

步骤2:添加AJAX处理脚本(放在页面底部)

document.getElementById('contactform').addEventListener('submit', function(e) {
    e.preventDefault(); // 阻止默认表单提交行为

    // 清除之前的错误和成功提示
    document.querySelectorAll('.invalid-feedback').forEach(el => el.remove());
    document.querySelectorAll('.is-invalid').forEach(el => el.classList.remove('is-invalid'));
    document.querySelector('.alert-success')?.remove();

    // 收集表单数据
    const formData = new FormData(this);

    // 发送AJAX请求
    fetch('contact_mail.php', {
        method: 'POST',
        body: formData
    })
    .then(response => response.json())
    .then(data => {
        if (!data.success) {
            // 遍历错误信息,显示到对应字段下方
            Object.entries(data.errors).forEach(([field, error]) => {
                const input = document.querySelector(`[name="${field}"]`);
                if (input) {
                    input.classList.add('is-invalid');
                    const errorDiv = document.createElement('div');
                    errorDiv.className = 'invalid-feedback';
                    errorDiv.textContent = error;
                    input.parentElement.appendChild(errorDiv);
                }
            });
        } else {
            // 显示成功提示并重置表单
            const successDiv = document.createElement('div');
            successDiv.className = 'alert alert-success mt-2';
            successDiv.textContent = data.message;
            this.parentElement.insertBefore(successDiv, this);
            this.reset();
            // 可选:重新生成验证码(需要额外AJAX请求获取新验证码)
        }
    })
    .catch(err => console.error('请求出错:', err));
});

步骤3:修改contact_mail.php

去掉跳转代码,确保返回JSON格式的结果:

<?php
$errors = array();
$data = array();

if (isset($_POST['submit'])){
    // 验证逻辑和之前一致
    if (empty($_POST['name_co'])) $errors['name_co'] = 'Name is required.';
    // ... 其他验证规则 ...

    if (!empty($errors)) {
        $data['success'] = false;
        $data['errors'] = $errors;
    } else {
        // 邮件发送逻辑
        $email_subject1 = 'Acknowledgement';
        $headers1 = "MIME-Version: 1.0\n";
        $headers1 .= "Content-type: text/html; charset=iso-8859-1" . "\n";
        $headers1 .= "From: your-email@example.com\n";
        $message1 = "<p>Hi {$_POST['name_co']},<br>Thank you for your query!</p>";
        $mailstatus1 = mail($_POST['email_co'], $email_subject1, $message1, $headers1);
        
        $data['success'] = true;
        $data['message'] = 'Your Query has been successfully submit. We will contact you very soon!!';
        // 移除跳转代码
        // header("location:thank-you.php");
        // exit;
    }
}

echo json_encode($data);
?>

注意事项

  • 邮件发送部分的$message1变量需要补充内容,否则邮件会为空。
  • htmlspecialchars()转义用户输入,防止XSS攻击。
  • 如果不用Bootstrap,可以自定义错误信息的样式(比如红色文本、边框等)。

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

火山引擎 最新活动