Sie haben nur vier Argumente durch die Steuerzeichenfolge "sssd" gebunden, aber Sie haben viele Parameter. Beim Binden von Variablen mit mysqli benötigen Sie für jeden Parameter ein Zeichen, zum Beispiel:
mysqli_stmt_bind_param($stmt, "sssdsssssssssdd", $firstname, $surname, $address,
$gender, $city, $province, $postalcode, $phone, $secondphone, $email,
$organization, $inriding, $ethnicity, $senior, $student);
(Ich gehe davon aus, dass senior und student ganze Zahlen sind und den Code „d“ benötigen.)
Sie müssen keine Ihrer Variablen mit mysqli_real_escape_string() behandeln – das ist der Sinn der Verwendung von Parametern. Wenn Sie auch maskieren, erhalten Sie buchstäbliche Backslash-Zeichen in Ihren Daten in der Datenbank.
Und Sie müssen auf keinen Fall htmlspecialchars() verwenden - Sie würden das bei der Ausgabe in HTML verwenden, nicht beim Einfügen in die Datenbank. Sie erhalten wörtliche Sequenzen wie &
in Ihre Daten in der Datenbank.
Re Ihr nächster Fehler:
Dies wird durch Folgendes verursacht:
$result = mysqli_query($mysqli,$stmt);
Diese Funktion erwartet, dass das zweite Argument eine Zeichenfolge ist, eine neue SQL-Abfrage. Aber Sie haben diese Abfrage bereits vorbereitet, also brauchen Sie Folgendes:
$result = mysqli_stmt_execute($stmt);