Ciao,
questa è la tua query originale :
$stmt->bind_param("ssssii",$username, $password, $gender, $email, $phoneCode, $phone, $firstname, $lastname);
non conosco MYSQI però sono abbastanza certo che le lettere della stringa corrispondano ai tipi (int varchar date) dei parametri indicati dopo la virgola.
$username è stringa quindi s, $password è stringa quindi s, $geneder è stringa quindi s,
$email è stringa quindi s, $phoneCode (avrebbe dovuto essere la data) ma hai indicato i cone integer,
$phone è integer quindi i ....manca la s di $firstaname e òa s di $lastname.
numero e tipo di parametro devono essere in numero uguale, di sicuro con PDO ma credo anche in MYSQLI.
Infatti se guardi la query che ti ho inviato
$stmt->bind_param("ssssssss",$username, $password, $gender, $email, $birth, $phone, $firstname, $lastname);
hai 8 caratteri che indicano il tipo degli 8 parametri passati, in PDO puoi evitare di collegare il tipo del parametro passato,
di norma assegna per default string che va bene con tutto ma in MYSQL non credo sia possibile, ma qualora sia possibile
è buona norma abituarsi a passare sempre i dati nel modo più completo, un aggiornamento potrebbe cambiare le cose
e .... dramma.
Non preoccuparti per la quantità di domande, agli inizi (l'anno scorso) in molti mi hanno aiutato con le loro risposte ed ora, se posso, mi fa piacere dare una mano.
Non ho capito però cosa stai facendo, ti stai esercitando con script generici o stai cercando di realizzare una tua applicazione ?
Nel secondo caso potrei evitarti la scrittura del codice di login inviandoti il template che uso io, inizialmente copiato
pari pari da internet e poi migliorato, la parte database è in PDO ma potrebbe essere utile per una migrazione
indolore a questa interfaccia che ti assicuro è quella consigliata in ogni manuale di PHP
Ciao