Hai verificato che:
- quel metodo venga effettivamente invocato
- il vettore di dati definisca almeno tutte le chiavi utilizzate nel codice
- il metodo crea_connessione imposti il valore dell'attributo PDO::ATTR_ERRMODE a PDO::ERRMODE_EXCEPTION
- non siano presenti altri errori (per esempio $connessione vale false perché l'inizializzazione fallisce), per esempio usando error_reporting(E_ALL)
Non credo sia collegato al problema, sono anzi abbastanza sicuro sia irrilevante, ma generalmente i ":" vengono utilizzati nei nomi degli identificatori dentro a bindParam:
Codice PHP:
$query->bindParam(":username", $dati['username'], PDO::PARAM_STR);
Un'altra questione secondaria è che stai usando bindParam, ma per come si comporta il codice sarebbe più adatto bindValue.