Vous n'avez lié que quatre arguments, par la chaîne de contrôle "sssd", mais vous avez de nombreux paramètres. Lorsque vous liez des variables avec mysqli, vous avez besoin d'un caractère pour chaque paramètre, par exemple :
mysqli_stmt_bind_param($stmt, "sssdsssssssssdd", $firstname, $surname, $address,
$gender, $city, $province, $postalcode, $phone, $secondphone, $email,
$organization, $inriding, $ethnicity, $senior, $student);
(Je suppose que senior et étudiant sont des nombres entiers et ont besoin du code "d".)
Vous n'avez pas besoin de traiter aucune de vos variables avec mysqli_real_escape_string() -- c'est l'intérêt d'utiliser des paramètres. Si vous échappez également, vous obtiendrez des caractères de barre oblique inverse littéraux dans vos données dans la base de données.
Et vous n'avez jamais besoin d'utiliser htmlspecialchars() dans tous les cas - vous l'utiliseriez lors de la sortie en HTML, pas lors de l'insertion dans la base de données. Vous allez obtenir des séquences littérales comme &
dans vos données dans la base de données.
Re votre prochaine erreur :
Ceci est causé par ce qui suit :
$result = mysqli_query($mysqli,$stmt);
Cette fonction s'attend à ce que le deuxième argument soit une chaîne, une nouvelle requête SQL. Mais vous avez déjà préparé cette requête, vous avez donc besoin des éléments suivants :
$result = mysqli_stmt_execute($stmt);