The validation fails because the file containing the validation logic is never executed when the form is submitted.
The standard and most effective solution is to handle everything in one file. The form page should be responsible for:
Displaying the form.
Receiving the submitted data.
Validating the data.
If invalid, re-displaying the form with errors.
If valid, performing the final action (like sending an email).
You just need to move the email-sending logic from form.php into the else block of your validation file.
Here is the corrected and combined code. You can replace the entire contents of your first file with this. You will no longer need form.php at all.
<?php
// 1. SETUP
$user = ['name' => '', 'age' => ''];
$errors = ['name' => '', 'age' => ''];
$message = '';
$form_submitted_successfully = false; // A flag to know when to hide the form
// 2. PROCESS FORM IF SUBMITTED
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Validation filters
$validation_filters['name']['filter'] = FILTER_VALIDATE_REGEXP;
$validation_filters['name']['options']['regexp'] = '/^[A-z]{2,10}$/';
$validation_filters['age']['filter'] = FILTER_VALIDATE_INT;
$validation_filters['age']['options']['min_range'] = 16;
$validation_filters['age']['options']['max_range'] = 65;
$user_input = filter_input_array(INPUT_POST, $validation_filters);
// Create error messages
$errors['name'] = $user_input['name'] ? '' : 'Name must be 2-10 letters using A-z';
$errors['age'] = $user_input['age'] ? '' : 'You must be between 16 and 65';
// Sanitize the original POST data to redisplay it safely in the form
$user['name'] = filter_var($_POST['name'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$user['age'] = filter_var($_POST['age'], FILTER_SANITIZE_NUMBER_INT);
// Check if there are any errors by joining all error messages
$invalid = implode($errors);
// 3. DECIDE WHAT TO DO NEXT
if ($invalid) {
// If there are errors, show an error message
$message = 'Please correct the following errors:';
} else {
// If data is valid, SEND THE EMAIL
$to = '
[email protected]'; // Use a real email address
$subject = 'Contact Form Submission';
$msg = "Name: {$user['name']}\n" .
"Age: {$user['age']}\n";
$headers = 'From:
[email protected]'; // It's good practice to set a From header
// The mail() function returns true on success, false on failure
if (mail($to, $subject, $msg, $headers)) {
$message = 'Thank you, your data has been sent!';
$form_submitted_successfully = true; // Set flag to true
} else {
$message = 'Sorry, there was an error sending your message. Please try again later.';
}
}
}
?>
<?php // include 'includes/header.php'; // Assuming you have this file ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Validation Form</title>
<style>
.error { color: red; font-size: 0.8em; display: block; }
body { font-family: sans-serif; }
input { margin-bottom: 10px; }
form { border: 1px solid #ccc; padding: 20px; max-width: 400px; }
.message { padding: 10px; background-color: #e0e0e0; margin-bottom: 15px; }
</style>
</head>
<body>
<h1>Contact Us</h1>
<?php if ($message): ?>
<p class="message"><?= $message ?></p>
<?php endif; ?>
<?php // Only show the form if it hasn't been submitted successfully
if (!$form_submitted_successfully): ?>
<form name="form" action="" method="POST">
Name: <input type="text" name="name" value="<?= htmlspecialchars($user['name']) ?>">
<span class="error"><?= $errors['name'] ?></span><br>
Age: <input type="text" name="age" value="<?= htmlspecialchars($user['age']) ?>">
<span class="error"><?= $errors['age'] ?></span><br>
<input type="submit" value="Submit">
</form>
<?php endif; ?>
</body>
</html>