Bonsoir,

Je bloque depuis trois jours sur ce truc, j'ai essayer pas mal d'approche différente mais ça ne fonctionne pas.
Je suis en train de créer un espace membre, j'aimerais éviter les doublons dans ma db, donc éviter qu'un user ne puisse s'inscrire 50 fois avec les même données.
Donc :
Comment feriez vous en théorie, pour savoir si l'user qui est en train de s'inscrire n'a pas déjà un compte ?
Je connais une partie de la réponse ^^ : Un select dans la db etc..

*Mais un select ou un select précis ?
Dois-je comparer un
tableau de donnée ou les données une par une (if email = email etc...)
Petite précision :
C'est un code procédural que je suis en train de produire.**
Avez-vous une manière simple de procéder ?
Si vous seriez a ma place que feriez-vous ?

20 réponses


Benjamin Derepas
Réponse acceptée

Tu dois d'abbord fetcher tes résultats pour pouvoir les exploiter.

$req = $cnx->query("SELECT count(id) as nbr FROM test WHERE email = $email");
$data = $req->fetchAll();
print_r($data); // pour visualiser les données récupérées.

Bonjour,

Il vous savoir qu'elles champs doivent être unique : email, pseudo...
Ensuite on interroge la bdd pour savoir si ses éléments y sont présent en utilisant AND, OR.... suivant ce que vous souhaiter faire.
Puis si la réponse est true alors vous informez le futur membre de changer ce qu'il ne va pas.

Tu fais une requete du type

$sql = "SELECT count(id) as nbr FROM user WHERE email = $email";

Si nbr est supérieur à 0, c'est que l'adresse email est déjà utilisée. Si il est égal à 1, c'est que cette personne à déjà créer un compte.
Et si nbr est supérieur à 1 ... problème
en partant du principe que l'email est unique pour chaque utilisateur.

Comme montré plus haut, il faut s'intéresser aux données les plus "importantes" donc e-mail, pseudo, lieu d'habitation, ou même adresse IP des choses dans ce genre. Sinon tu peux créer un token en cookie ou en session, pour encore plus sécuriser la chose. Et tu compares le cookie qu'il a dans ses cookies ou sessions aux tokens de la BDD (si la personne tente de s'inscrire évidemment).

salut,
Il suffit de definir en clé UNIQUE le champs concerné en base de données ainsi lors de l'insertion d'une donnée identique cela genérera une erreur.

Laznet
Auteur

Merci pour vos réponses,

@Kraddle - Ca généra une erreur récupérable par la variable qui contient la requête. (Souvent $req) ?

EDIT - J'ai re-lu ton post Kraddle, c'est lors de l'insertion que ça généra une erreur. Donc c'est bien ce que je pensais :D

Laznet
Auteur

Bonsoir,

Après avoir fait quelque test ^^
J'ai vu que l'élément n'est pas inséré quand il existe déjà dans la table.
Mais comment récupérer cette erreur ? Comment signaler a l'user que ça n'a pas fonctionner ?
Vu que dans tout les cas la requête fonctionne ?

Je vais utiliser ta requête Benjamin

c'est pas ce qu'il te fallait à l'insertion?

"Comment feriez vous en théorie, pour savoir si l'user qui est en train de s'inscrire n'a pas déjà un compte ?" => insertion d'un nouveau utilisateur

Laznet
Auteur

Bah oui, mais je n'ai pas le moyen de savoir si il existe déjà ou pas.
Juste la donnée n'a pas été insérer en interne.
Mais aucune réponse a l'user.

Et je ne sais pas comment utiliser nbr. C'est une variable ? Une fonction.

Si il y a érreur alors fait par exemple if($bdd->query) -> ça retourne false ou true selon la réussite (true) ou non (false) de la requête, ça serait le seul moyen, si tu utilises cette technique là je pense

Bonsoir.

Et je ne sais pas comment utiliser nbr. C'est une variable ? Une fonction.

Ce n'est rien de plus qu'un ALIAS, si tu regardes dans la requête qu'il te montre, tu as AS, qui est une clé pour définir un alias, souvent utilisé dans les associations de plusieurs tables.
Tu peux mettre autre chose que nbr, par exemple exist, pour faire simple, tu peux nommer l'alias comme tu le souhaite, du moment que tu t'y retrouve dans l’appellation.

Laznet
Auteur

Merci Lartak pour cette info.
Donc maintenant ce que je ne comprend pas (Je suis aller voir sur la doc de MySQL)
c'est a quoi sert l'alias dans cette requête.
Enfin, comment l'utiliser dans le reste de mon code.
C'est du SQL, donc comment savoir si nbr < 0 ou si il est supérieur ?

Laznet
Auteur

J'ai pensé a une manière de faire en utilisant les champs unique :

J'insère en base mes champ unique,
Ensuite je selectionne dans cette même base les éléments unique, si quelque chose a été insérer et est égal a ce qu'a entré l'user ça veut dire qu'il vient de s'inscrire.
Sinon ça veut dire qu'il existe déjà. Donc c'est comme ça que je peux signalé à mes users.

Qu'en pensez-vous ?

Un alias, comme je te l'ai dit, sert à renommer par exemple le nom d'un champ, donc si par exemple dans une table tu as un champ qui se nomme date_anniversaire, en lui mettant l'alias birthday en retour tu auras le second nom, ce qui par exemple te donnera $req['bithday'] au lieu de $req['date_anniversaire'].
Dans l'exemple que te montre Benjamin Derepas, la requête SQL te retournera $req['nbr'] qui pourra soit valoir 0, soit 1 ou plus, au lieu de n'avoir la valeur que sur la variable $req.

Laznet
Auteur

Intéressant :D

Merci beaucoup !

Laznet
Auteur

Maintenant que j'ai acquis la théorie, j'ai un petit problème sur la pratique.

    $q = array('text' => $text);
    $sql = "SELECT count(id) as nbr FROM test WHERE email = $email";
    $req = $cnx->prepare($sql);
    $req->execute($q);
    if($req){
        if($req['nbr'] = 0){ // Ligne 22 de l'erreur
            echo "GOOD";
        } elseif($req['nbr'] > 0){
            echo "BAD";
        }

    }

Après avoir soumis le formulaire, j'ai cette erreur : Fatal error: Cannot use object of type PDOStatement as array in ...... on line 22

EDIT : Peut être que l'erreur vient de mon array.

EDIT 2 : Après avoir utiliser ce code (en dessous) je n'ai plus l'erreur mais malgré qu'il y est deux fois le même éléments dans la bdd ça ne fonctionne pas.


$req = $cnx->query("SELECT count(id) as nbr FROM test WHERE email = $email");
    if($req){
        if($req['nbr'] = 0){
            echo "GOOD";
        } elseif($req['exist'] > 0){
            echo "BAD";
        }

    }

D'ailleurs if($req['nbr'] = 0){ ne fonctionnera pas il faut que tu mettes if($req['nbr'] == 0){.

De plus, je te conseille vivement d'aller suivre une formation PHP soit ici soit sur OpenClassRooms ou ailleurs, mais vu les erreures/incompréhension que tu as sur des codes basiques en PHP tu ne vas pas aller bien loin à ce niveau.

Laznet
Auteur

J'ai un bon niveau en PHP.
Bien évidemment comme tout le monde je ne connais pas tout.

Salut,

J'ai un bon niveau en PHP.

On ne dirait pas que le niveau en PHP soit le problème, on dirait plutôt que c'est le niveau en anglais qui fait que tu ne comprends pas tes erreurs.

Laznet
Auteur

Je manque surtout de connaissance sur tout ce qui touche au requêtes (Avec PDO ^^).
Fetch, fetch(); prepare ne sont que pour moi de vague mot que je copie colle d'un projet de dev à l'autre.