Comment éviter compte client existe 2fois

Résolu
Bonjour,

J'ai mis en place un formulaire de création de compte et une requête/condition associée qui dit :

Si tous les champs demandés sont renseignés alors envoie des données dans la bdd et par mail au client pour résumé des identifiants

Sinon message : "Veuillez renseigner tous les champs demandés" et ne s'enregistre pas dans la bdd.

Je souhaiterais en plus de cette première condition en réaliser une autre qui empêcherait la création de deux comptes possédants les mêmes identifiants ?

Mon code :

<?php

try

{
// On se connecte à MySQL
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=album_photos', 'root', '', $pdo_options);

{
if(($_POST['nom']) AND ($_POST['prenom']) AND ($_POST['adresse']) AND ($_POST['code_postale']) AND ($_POST['ville']) AND ($_POST['pays']) AND ($_POST['email']) AND ($_POST['mot_de_passe']) != null)
{
mail ($_POST['email'], $titre, $message, $header);
?>
<script type="text/javascript" >
alert("Votre compte vient d'être créé");
window.location.replace("http://localhost/album_photos/creation_compte.php");
</script>
<?php
$req=$bdd->prepare('INSERT INTO session (nom, prenom, adresse, code_postale, ville, pays, email, telephone, mot_de_passe) VALUES (:nom, :prenom, :adresse, :code_postale, :ville, :pays, :email, :telephone, :mot_de_passe)');
$req->execute(array(
'nom' => $_POST['nom'],
'prenom' => $_POST['prenom'],
'adresse' => $_POST['adresse'],
'code_postale' => $_POST['code_postale'],
'ville' => $_POST['ville'],
'pays' => $_POST['pays'],
'email' => $_POST['email'],
'telephone' => $_POST['telephone'],
'mot_de_passe' => $_POST['mot_de_passe']));

$req->closeCursor();
}
else
{
?>
<script type="text/javascript" >
alert("Veuillez renseigner tous les champs demandés");
window.location.replace("http://localhost/album_photos/creation_compte.php");
</script>
<?php
}
}
}
catch(Exception $e)
{
die('Erreur: '.$e->getMessage());
}

?>

Merci pour votre aide...

9 réponses

  1. Salut,

    il faut mettre une contrainte d'unicité dans ta base de données, sur les champs que tu souhaites unique (login, adresse mail...)
    1. J'ai fais ça (partie du code premier message) :

      {
      if(($_POST['nom']) AND ($_POST['prenom']) AND ($_POST['adresse']) AND ($_POST['code_postale']) AND ($_POST['ville']) AND ($_POST['pays']) AND ($_POST['email']) AND ($_POST['mot_de_passe']) != null)
      if (!mysql_fetch_row($_POST['email'])== null)
      {
      mail ($_POST['email'], $titre, $message, $header);
      ?>

      et ça me marque l'erreur suivante :

      Warning: mysql_fetch_row() expects parameter 1 to be resource, string given in ... on line 29

      Que dois je faire ???
      1. Non, c'est dans la structure de ta bd que tu dois définir une contrainte d'unicité.

        Quelque chose du genre :

        ALTER TABLE "User"
        ADD CONSTRAINT "Unique_Email" UNIQUE("Email");
        1. euh ???
          Désolé je suis pommée...
          Je ne sais pas ce que cela signifie ?
          1. Ce n'est pas en php que se définit ta contrainte d'unicité mais en SQL

            MySQL permet directement de dire que chaque valeur du champ "mail" dans la bd ne doit se retrouver qu'une seule et unique fois au maximum.

            Ceci se fait avec la commande du dessus.

            Tu utilises phpMyAdmin ?
            1. j'ai trouvé dans bdd. Petit icône U.
              Pour le mdp ça a marché mais pour l'email il marque :
              #1170 - BLOB/TEXT column 'email' used in key specification without a key length

              ???
              1. Email est la clef primaire de ta table ?
              2. Non.
                id est la clef primaire...
            2. Bien alors tu peux faire de deux façons :

              - soit tu entres la commande du dessus (avec ton champ que tu souhaites rendre unique et la table qui va avec ) directement à l'endroit ou tu peux rentrer une commande SQL.

              - ou tu peux le faire par interface graphique en cochant "unique" quelque part en face du champ voulu

              (désolé peut pas être plus précis, pas phpmyadmin sous la main...)
              1. (et il est idiot de mettre un mdp unique. Pourquoi interdirais tu à deux personnes différentes d'avoir le même mot de passe ??)
              2. En fait je souhaite tout simplement refuser la création de deux comptes similaires (même email et même mdp).
                Je ne dois peut être pas faire comme dit précédemment finalement ??
              3. Bah non, il ne faut pas créer une contrainte d'unicité sur chaque, mais une contrainte d'unicité sur le couple, ce qui est tout à fait différent !

                ALTER TABLE "User"
                ADD CONSTRAINT "Unique_couple_emailmdp" UNIQUE("Email","mdp");

                ce qui est tout à fait différent de :

                ALTER TABLE "User"
                ADD CONSTRAINT "Unique_Email" UNIQUE("Email");
                ALTER TABLE "User"
                ADD CONSTRAINT "Unique_mdp" UNIQUE("mdp");
              4. Il m'affiche cette erreur :

                #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"User" ADD CONSTRAINT "Unique_couple_emailmdp" UNIQUE("Email","mdp")' at line 1
              5. Pour ce qui est de l'unicité, je l'ai faite que sur l'email. Cela permet à deux clients différents de s'identifier avec deux email différents mais avec le même mdp.
                Ca marche !

                Par contre comment puis je faire pour récupérer cette unicité et afficher un message au client lorsque son email est déjà enregistré dans la bdd ?
            3. salut,

              C'est super grossier, mais je ferais quelque chose comme ça :
              $req = "select count(email) from masuperbetable where email='lenouvelemail'"; 
              $nbmail = $PDO->query($req); 
              if ($nbmail<1){ 
                  echo 'Mail unique'; 
                   
              }else{ 
                  echo 'mail deja present dans la base'; 
              } 
              
              

              Tout vient à point à qui sait attendre
              ~~ Cr3u7z0u ~~
              1. J'avoue c'est super grossier ^^. Mais ça marche ^^

                Le plus propre serait de générer une erreur lors d'une tentative de viol de cette contrainte d'unicité (tu utilises PDO ?) et dans le traitement de cette erreur, tu affiches le message d'erreur voulu.
              2. Je suis tout ouïe pour connaître cette méthode ???
                Oui j'utilise PDO.
              3. comment tu ferais ça ? tu tenterais de mettre la nouvelle adresse, et de récupérer l'exception ?
              4. Je répondrais ce soir, dsl, je suis au boulot là ^^

                Mais promis je le ferais ^^
              5. help !!!!
                Je ne sais pas encore ce que j'ai foutu mais phpMyAdmin ne veut plus s'ouvrir. Il marque :
                phpMyAdmin - Erreur

                Erreur lors du démarrage de la session, veuillez vérifier les erreurs indiquées par PHP ou dans le fichier témoin du serveur web, et configurer PHP correctement.

                De quoi parle t-il ? Je n'ai rien changé par rapport à quand ça marché ???