suas variáveis como
$fname $lname $gender $age $email $course
são colocados na condição if após a condição if para isset($_POST['register'])
. Agora, mesmo que sua validação funcione, os dados ainda serão inseridos no banco de dados. porque você colocou condição if($fname&&$lname&&$gender&&$age&&$email&&$course)
Agora o controle entrará nesse bloco quando você tiver um único valor em todas essas variáveis. O que deve estar acontecendo é que você colocou valores errados, esses estão sendo validados, a mensagem será mostrada, mas quando primeiro se o bloco terminar, pois as variáveis $_POST ainda possuem ALGUM valor, independente de serem inválidas, segundo se o bloco será inserido e a consulta será acionada.
O que você pode fazer é, onde quer que você esteja ecoando a mensagem de erro, apague essa respectiva variável. algo assim:
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 = "";
}