Ce que tu fais actuellement :
- Variable $this->d;
- Tant qu'on a des résultats en BDD, $this->d est égal au dernier résultat.
En gros dans chaque étape de la boucle ton $this->d est égal à la rangée actuelle de la BDD, et une fois la boucle finie ton $this->d contient uniquement la dernière rangée qui est passée dans la boucle.
Chaque rangée en BDD (que tu récupère avec $q->fetch()) te retourne un tableau indexé (chaque index étant le nom d'un champ de ta table).
Tu peux donc accéder à $this->d['username'].
En revanche, si tu veux toutes les entrées, c'est bien $q->fetchAll() qu'il faut utiliser, ça te retournera un tableau, lui-même contenant toutes les rangées. Tu auras donc un tableau qui contient tous les $this->d qui passent actuellement dans ta boucle.
Tu ne peux donc pas accéder à l'index 'username' directement, il faut d'abord sélectionner un élément du tableau (qui représente une rangée en BDD), et tu pourras alors accéder à toutes ses propriétés.
Admettons que $q->fetchAll() soit dans une variable $all :
$all[0]['username'] te donnera le nom d'utilisateur du premier membre. $all[1]['password'] te donnera le mot de passe du deuxième membre, etc...