Solo ha vinculado cuatro argumentos, mediante la cadena de control "sssd", pero tiene muchos parámetros. Al vincular variables con mysqli, necesita un carácter para cada parámetro, por ejemplo:
mysqli_stmt_bind_param($stmt, "sssdsssssssssdd", $firstname, $surname, $address,
$gender, $city, $province, $postalcode, $phone, $secondphone, $email,
$organization, $inriding, $ethnicity, $senior, $student);
(Supongo que senior y estudiante son números enteros y necesitan el código "d").
No necesita tratar ninguna de sus variables con mysqli_real_escape_string(); ese es el objetivo de usar parámetros. Si también escapa, obtendrá caracteres de barra invertida literales en sus datos en la base de datos.
Y nunca necesita usar htmlspecialchars() en ningún caso; lo usaría al enviar a HTML, no al insertar en la base de datos. Obtendrá secuencias literales como &
en sus datos en la base de datos.
Re su próximo error:
Esto es causado por lo siguiente:
$result = mysqli_query($mysqli,$stmt);
Esa función espera que el segundo argumento sea una cadena, una nueva consulta SQL. Pero ya ha preparado esa consulta, por lo que necesita lo siguiente:
$result = mysqli_stmt_execute($stmt);