le tue variabili come $fname $lname $gender $age $email $course
vengono inseriti se condizione dopo se condizione per isset($_POST['register'])
. Ora anche se la tua convalida funzionerà, i dati verranno comunque inseriti nel database. perché hai messo la condizione
if($fname&&$lname&&$gender&&$age&&$email&&$course)
Ora il controllo entrerà in quel blocco quando hai anche un singolo valore in tutte quelle variabili. Quello che deve succedere è che metti valori errati, quelli vengono convalidati, verrà mostrato il messaggio, ma quando prima se il blocco finisce, poiché le variabili $_POST hanno ancora ALCUNI valori, indipendentemente dal fatto che non siano validi, secondo se verrà inserito il blocco e la query verrà avviata.
Quello che puoi fare è, ovunque tu stia echeggiando un messaggio di errore, oscurare quella rispettiva variabile. qualcosa del genere:
if (preg_match("/[a-zA-Z ]+$/", $_POST['fname'])) {
$fname = trim($_POST['fname']);
}
else
{
echo '<p>The First name is empty or has illegal characters! To edit please go the link Display Data Information</p>';
$fname = "";
}