Anda hanya mengikat empat argumen, dengan string kontrol "sssd", tetapi Anda memiliki banyak parameter. Saat mengikat variabel dengan mysqli, Anda memerlukan satu karakter untuk setiap parameter, misalnya:
mysqli_stmt_bind_param($stmt, "sssdsssssssssdd", $firstname, $surname, $address,
$gender, $city, $province, $postalcode, $phone, $secondphone, $email,
$organization, $inriding, $ethnicity, $senior, $student);
(Saya berasumsi senior dan siswa adalah bilangan bulat, dan memerlukan kode "d".)
Anda tidak perlu memperlakukan variabel Anda dengan mysqli_real_escape_string() -- itulah gunanya menggunakan parameter. Jika Anda lolos juga, Anda akan mendapatkan karakter garis miring terbalik literal dalam data Anda di database.
Dan Anda tidak perlu menggunakan htmlspecialchars() dalam hal apa pun - Anda akan menggunakannya saat mengeluarkan ke HTML, bukan saat memasukkan ke database. Anda akan mendapatkan urutan literal seperti &
dalam data Anda di database.
Ulangi kesalahan Anda berikutnya:
Hal ini disebabkan oleh hal berikut:
$result = mysqli_query($mysqli,$stmt);
Fungsi itu mengharapkan argumen kedua menjadi string, kueri SQL baru. Tapi Anda sudah menyiapkan kueri itu, jadi Anda memerlukan yang berikut ini:
$result = mysqli_stmt_execute($stmt);