Comment vérifier qu'un utilisateur est unique ?

Ce sujet est résolu
152061
,

Bonjour,

Je me suis résigné à demander de l'aide.

ça fait des heures que je cherche où est-ce que j'ai fait une erreur.

Voila je souhaite faire espace membre en POO MVC,
Je l'avais très bien fait en procédurale

Mais en POO MVC les choses se complique pour moi et je n'arrive pas à comprendre l'erreur.

Voici le code du fichier UsersTable

Il sagit là en réalité d'une requette préparé

    public function isUniq($username, $email){
        $this->query("SELECT id FROM users WHERE username = ?, email = ?", [$username, $email],true);
    }

Voici le code fichier HomeController.

    public function register(){             

        $errors =[];
        $success = [];


        if(!empty($_POST)){

            $validator = new Validator($_POST);
            $validator->isAlpha('username', "Votre pseudo n'est pas valide (alphanumérique)");
            $validator->isEmail('email', "Votre email n'est pas valide");
            $validator->isConfirmed('password', 'Les deux mots de pass doivent être identique');






            if($validator->isValid()){
                $Uniq = $this->Users->isUniq($_POST['username'], $_POST['email']);
                if ($Uniq) {
                    if($Uniq->email){
                        $validator->isUniq('email', 'Cet email est déjà utilisé pour un autre compte');
                    }

                    if($Uniq->username){
                        $validator->isUniq('username', 'Ce pseudo est déjà pris');
                    }
                    exit();

                }else{
                    $password = $this->hashPassword($_POST['password']);
                    $token = Str::random(60);
                    $this->Users->register($_POST['username'], $password, $_POST['email']);
                    $success = ['Un email de confirmation vous a été envoyé pour valider votre compte'];
                    header('Location: index.php?p=uwandzani.home.index');
                }

             } else {
                $errors = $validator->getErrors();
            }
        }

        $form = new BootstrapForm($_POST);
        $this->render('uwandzani.register', compact('form', 'success', 'errors'));
    }

Et voici enfin le code du fichier Validator

    public function isUniq($field, $errorMsg){
            $this->errors[$field] = $errorMsg;
            return false;
    }

Les code du fichier validator sont bien fait.

Le problème se pose au moment où il faut faire la requette à la BDD

Ce que je veux

Je souhaite que lorsqu'un utilisteur veuille s'incrire PHP aille vérifier s'il n'existe pas déjà dans BDD un utilisateur qui porte le même pseudo ou qui a le même mail.

Ce que j'obtiens

( ! ) Fatal error: in C:\wamp\www\Exo PHP\UWANDZANI_POO\core\Database\MysqlDatabase.php on line 70
( ! ) PDOException: in C:\wamp\www\Exo PHP\UWANDZANI_POO\core\Database\MysqlDatabase.php on line 70
Call Stack

Time Memory Function Location

1 0.0020 142088 {main}( ) ...\index.php:0
2 0.0224 274928 App\Controller\Uwandzani\HomeController->register( ) ...\index.php:46
3 0.0224 275112 App\Table\UsersTable->isUniq( ) ...\HomeController.php:79
4 0.0224 275512 Core\Table\Table->query( ) ...\UsersTable.php:25
5 0.0224 275672 Core\Database\MysqlDatabase->prepare( ) ...\Table.php:98
6 0.0340 282784 execute ( ) ...\MysqlDatabase.php:70

5 Réponse

17162
,

J'ai reussi à inserer les donner dans BDD

J'ai quand même un doute sur le fait que tu aies pu inséré les données en BDD étant donné que dans ta méthode register tu définis en quatrième argument le token, sauf que lorque tu fais appel à la méthode register dans ton controller, tu ne passes pas le token, tu ne lui passes que 3 arguments sur les 4.
Sans oublier, que ta variable success ne sert toujours à rien.

Mais le problème c'est que je n'arrive toujours pas à les recupérer.

La requête SQL concernant la méthode isUniq2 est pourtant correcte à première vue, par contre si tu veux dire après l'enregistrement en base de donnéées, je ne sais pas sur quelle méthode tu parles, en tout cas il y a plusieurs possibilités.
Si tu veux dire qu'après que tu aies enregistré l'utilisateur que lorsque tu tentes de l'enregistrer à nouveau que tu n'as pas de retour d'erreur disant qu'au moins l'un des identifiant est déja utilisé, c'est peut-être justement parce que l'enregistrement ne se fait pas par rapport à ce que je t'ai dit concernant le token que tu ne passes pas à la méthode register, par conséquent tu ne peux pas trouver l'utilisateur en BDD.
Autre chose aussi, si tu ne demandes pas à la méthode isUniq2 de te retourner le retour de la requête, tu ne risques pas de pouvoir utiliser les données qui auraient pu être récupérées par la base de données, par conséquent, la variable $Uniq ne vaut absolument rien.
Tu devrais donc au moins faire :

public function isUniq2($username, $email){
    return $this->query("SELECT username, email FROM users WHERE username = ? OR email = ?", [$username, $email], true);
}
40917
,

Bonsoir,
Ce n'est pas une virgule dans la clause WHERE mais plûtôt un OR
As-tu activé les erreurs PDO ?

17162
,

Bonsoir.
Pour commencer, les conditions suivantes sont incorrectes :

if($Uniq->email){
    $validator->isUniq('email', 'Cet email est déjà utilisé pour un autre compte');
}
if($Uniq->username){
    $validator->isUniq('username', 'Ce pseudo est déjà pris');
}

Tu fais juste une condition sur des chaîne de caractères, sans faire de comparaison de valeur ou de type, donc PHP ne peut pas savoir ce que tu veux vérifier.
Ensuite, tu fais un exit totalement inutile puisque tu es déjà à la fin d'une condition.
Tu définies la variable $token = Str::random(60); que tu n'utilises à aucun moment.
Par contre, quel est l'intérêt de stocker un tableau dans une variable, alors qu'avec le header('Location: index.php?p=uwandzani.home.index'), tu perds cette même variable ?

Je souhaite que lorsqu'un utilisteur veuille s'incrire PHP aille vérifier s'il n'existe pas déjà dans BDD un utilisateur qui porte le même pseudo ou qui a le même mail.

Sauf que dans la requête SQL que tu fais, tu fais comme-ci tu faisais un INSERT ou un UPDATE, si tu veux faire une requête SQL qui va récupérer un enregistrement qui correspondrait à ce que tu veux faire, il te faut utiliser le mot clé adéquat, soit :

SELECT id FROM users WHERE username = ? OR email = ?

De plus qu'en ne récupérant que le champ id, tu ne peux pas utiliser les champs username et email par la suite, ce que tu tentes de faire avec ta condition que j'ai cité précédemment.

152061
,

Merci les gas.

Mais là il est deux heures du matin et je suis au bout de ma réfflexion.

Après refexions et un peu de travail sur autre chose pour me changer les idées.

J'ai reussi à inserer les donner dans BDD

Mais le problème c'est que je n'arrive toujours pas à les recupérer.
Et je n'arrive toujours pas à comprendre où est-ce que j'ai fait l'erreur.

Voici le code du model.

    public function isUniq2($username, $email){
        $this->query("SELECT username, email FROM users WHERE username = ? OR email = ?", [$username, $email],true);
    }

    public function register($username, $password, $email, $token){
        $this->query("INSERT INTO users SET username = ?, password = ?, email = ?, confirmation_token = ?", 
            [ $username, $password, $email, $token], true);

    }

Et voici le code du controlleur

            if($validator->isValid()){

                $Uniq = $this->Users->isUniq2($_POST['username'], $_POST['email']);

                if ($Uniq){

                    if($Uniq->email === $_POST['email']){
                        $validator->isUniq('email', 'Cet email est déjà utilisé pour un autre compte');
                    }

                    if($Uniq->username === $_POST['username']){
                        $validator->isUniq('username', 'Ce pseudo est déjà pris');
                    }
                }else{
                    $password = $this->hashPassword($_POST['password']);
                    $token = Str::random(60);
                    $this->Users->register($_POST['username'], $password, $_POST['email']);
                    $success = ['Un email de confirmation vous a été envoyé pour valider votre compte'];
                    header('Location: index.php?p=uwandzani.home.attenteConfirmation');
                }

             } else {
                $errors = $validator->getErrors();
            }

Allez bonne nuit, apparemment la nuit porte conseil.

152061
,

Sisi Lartak l'enregistrement était bien fait !