Você vinculou apenas quatro argumentos, pela string de controle "sssd", mas tem muitos parâmetros. Ao vincular variáveis com mysqli, você precisa de um caractere para cada parâmetro, por exemplo:
mysqli_stmt_bind_param($stmt, "sssdsssssssssdd", $firstname, $surname, $address,
$gender, $city, $province, $postalcode, $phone, $secondphone, $email,
$organization, $inriding, $ethnicity, $senior, $student);
(Estou assumindo que senior e student são números inteiros e precisam do código "d".)
Você não precisa tratar nenhuma de suas variáveis com mysqli_real_escape_string() -- esse é o ponto de usar parâmetros. Se você também fizer o escape, obterá caracteres literais de barra invertida em seus dados no banco de dados.
E você nunca precisa usar htmlspecialchars() em qualquer caso - você usaria isso ao enviar para HTML, não ao inserir no banco de dados. Você obterá sequências literais como
&
em seus dados no banco de dados. Re seu próximo erro:
Isso é causado pelo seguinte:
$result = mysqli_query($mysqli,$stmt);
Essa função espera que o segundo argumento seja uma string, uma nova consulta SQL. Mas você já preparou essa consulta, então você precisa do seguinte:
$result = mysqli_stmt_execute($stmt);