IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Contrôler qu'un pseudo n'existe pas déjà lors de l'inscription d'un utilisateur [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut Contrôler qu'un pseudo n'existe pas déjà lors de l'inscription d'un utilisateur
    Bonjour,
    Lorsqu'un utilisateur demande son inscription comme membre, je l'enregistre provisoirement dans une table dat_users_query. Lorsqu'il valide son inscription, je l'enregistre dans dat_users et j'efface la ligne correspondante dans dat_users_query.
    Lors de sa demande d'inscription, je vérifie que son pseudo et son adresse mail n'existent dans aucune des deux tables avec cette fonction... qui ne marche pas:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function checkIfDataExists($col, $value) {
    	global $db;
    	var_dump($col, $value);
     
    	$query = "
    		SELECT COUNT(*) AS counter FROM dat_users WHERE $col=:value 
    		UNION ALL 
    		SELECT COUNT(*) AS counter FROM dat_users_query WHERE $col=:value
    	";
    	$result=$db->prepare($query);
    	$result->bindValue(':value', $value);
    	$result->execute();
    	return $result->fetchColumn();
    }

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    Salut,
    as-tu essayé de mettre des apostrophes autour de la variable $col ?
    comme

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Sur ton indication, j'ai essayé mais j'ai déjà mis des variables pour les noms de colonnes ou de tables et ça marche très bien.
    Je suis presque sûr que c'est la requête qui n'est pas bonne.

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    Quand tu exécute la requête dans phpmyadmin, ça te renvois bien quelque chose ?

    sinon essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $query = "
    		SELECT COUNT(*) AS counter FROM dat_users WHERE :colonne=:value 
    		UNION ALL 
    		SELECT COUNT(*) AS counter FROM dat_users_query WHERE :colonne=:value
    	";
    	$result=$db->prepare($query);
    	$result->bindValue(':value', $value);
            $result->bindValue(':colonne',$col);
    	$result->execute();

  5. #5
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    "Ca ne marche pas" ne veut rien dire. Il faut toujours préciser ce qui te fait dire que ça ne marche pas.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Personnellement, j'utiliserai une seule table agrémentée d'une colonne avec la date d'inscription et d'une colonne de type boolean pour signifier si le compte est confirmé ou non: de cette manière il est facile d'automatiser la suppression des comptes non confirmés au delà d'une certaine période.

    J'ajouterai une contrainte d'unicité sur la colonne pseudo, ainsi je n'aurai qu'à me fier à l'erreur émise par MySQL (erreur 1062) lors de la tentative d'insert, pour connaître le problème et afficher le message adéquate.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Personnellement je ne ferais pas comme CosmoKnacki. Les contrôles doivent être séparés de la mise à jour des données.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Pour contrôler les données provenant de l'extérieur, je suis d'accord, mais là tout ce que tu fais c'est une requête inutile la plupart du temps pour vérifier que le pseudo n'existe pas déjà. Donc autant y aller carrément et tenter l'insert, tu économiseras un requête.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Je vais essayé de réunir les deux tables en une seule selon les indications de CosmoKnacki. En ce qui concerne les doublons, je pense que, côté client, il est bon d'indiquer à l'internaute si le pseudo est déjà utilisé avant de l'enregistrer ce qui n'empêche pas de faire le contrôle côté serveur.
    Je marque provisoirement le sujet comme résolu. Je le rouvrirai si nécessaire.

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Pour information : cette requête ne fonctionnera pas :
    Citation Envoyé par Toufik83 Voir le message
    sinon essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $query = "
    		SELECT COUNT(*) AS counter FROM dat_users WHERE :colonne=:value 
    		UNION ALL 
    		SELECT COUNT(*) AS counter FROM dat_users_query WHERE :colonne=:value
    	";
    On ne peut pas paramétrer les noms des tables et des colonnes, car PDO va échapper les valeurs, ce qui donnera :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) AS counter FROM dat_users WHERE 'nom_colonne'='valeur'
    au lieu de :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) AS counter FROM dat_users WHERE nom_colonne='valeur'
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  11. #11
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    oui Celira, tu as raison.(+1)
    j'ai été trop vite dans ma réponse oui , en plus j'avais le même problème auparavant et j'ai finis par comprendre qu'on ne peut pas passer les noms des tables et les colonnes en tant que paramètres.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vérifier qu'un pseudo n'existe pas
    Par moimp dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/12/2018, 09h17
  2. [PB ODBC] Ce serveur n'existe pas ou son accès est refusé
    Par meufeu dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/12/2015, 18h02
  3. Réponses: 5
    Dernier message: 15/12/2008, 16h23
  4. erreur : la table n'existe pas !!!
    Par djouahra.karim1 dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/06/2005, 14h17
  5. Le membre de collection requis n'existe pas
    Par mschistozis dans le forum Access
    Réponses: 4
    Dernier message: 25/10/2004, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo