Nie jestem jakiś wybitny specjalista , dopiero się uczę 
Niemniej wydaje mi się że masz błąd
$answer = $db -> Query('SELECT `login` FROM `users` WHERE `login`="' . $login . '"');
$answer = $answer -> fetchAll();
if(!empty($answer)) {
header("Location: register_form.php?error=2");
exit;
}
powinno moim zdaniem wyglądać tak
$answer = $db -> Query('SELECT `login` FROM `users` WHERE `login`="' . $login . '"');
$row = $answer -> fetchAll();
if(!empty($row)) {
header("Location: register_form.php?error=2");
exit;
}
INSERT ja robie w ten sposób
$zapytanie = $polaczenie->prepare("INSERT INTO maile (mail_id, tytul, tresc, nadawca, odbiorca, stan, data_nadania)
VALUES (0, :tytul, :tresc, :nadawca, :odbiorca, :stan, Now())");
$zapytanie->bindParam(':tytul' , $temat, PDO::PARAM_STR);
$zapytanie->bindParam(':tresc' , $tresc, PDO::PARAM_STR);
$zapytanie->bindParam(':nadawca' , $nadawca, PDO::PARAM_STR);
$zapytanie->bindParam(':odbiorca' , $odbiorca, PDO::PARAM_STR);
$zapytanie->bindParam(':stan' , $nowa, PDO::PARAM_STR);
if($zapytanie->execute())
{
echo "treść komunikatu ";
}
}
catch(PDOException $e)
{
echo $zapytanie . "<br>" . $e->getMessage();
}
$polaczenie = null;
I wszystko działa jak należy