Svázali jste pouze čtyři argumenty pomocí řídicího řetězce "sssd", ale máte mnoho parametrů. Při vázání proměnných pomocí mysqli potřebujete jeden znak pro každý parametr, například:
mysqli_stmt_bind_param($stmt, "sssdsssssssssdd", $firstname, $surname, $address,
$gender, $city, $province, $postalcode, $phone, $secondphone, $email,
$organization, $inriding, $ethnicity, $senior, $student);
(Předpokládám, že starší a student jsou celá čísla a potřebují kód "d".)
Nemusíte ošetřovat žádnou ze svých proměnných pomocí mysqli_real_escape_string() -- to je smysl použití parametrů. Pokud provedete také escapování, získáte ve svých datech v databázi doslovné zpětné lomítko.
A v žádném případě nemusíte nikdy používat htmlspecialchars() – ten byste použili při výstupu do HTML, nikoli při vkládání do databáze. Získáte doslovné sekvence jako &
ve vašich datech v databázi.
Re vaše další chyba:
To je způsobeno následujícím:
$result = mysqli_query($mysqli,$stmt);
Tato funkce očekává, že druhý argument bude řetězec, nový SQL dotaz. Ale tento dotaz jste již připravili, takže potřebujete následující:
$result = mysqli_stmt_execute($stmt);