Zamiast md5 używaj password_hash i password_verify.
Dlaczego czasem używasz bindowania, a czasem nie? Wszędzie gdzie tylko możesz binduj wartości bo np. to
$db -> Exec('INSERT INTO `uzytkownicy` VALUES ("", "", "'.$login.'", "'.$email.'", "'.$haslo.'", "wylogowany", "0", now(), "", "'.$klucz.'")');
Jest całkowicie nieodporne na sql injection.
$login = $_POST['login'];
A co jak ktoś nie prześle tego loginu przez POST? Skrypt wysypie ostrzeżenie, lepiej byłoby się przed tym zabezpieczyć.
strlen() ma problem z liczeniem polskich znaków, lepiej używać mb_strlen().
A tak ogólnie to raz nazywasz zmienne po polsku, raz po angielsku, proponowałbym zawsze robić jednolicie, po angielsku.