Système d'inscription sur son site.

Eléphant du PHP | 75 Messages

23 mars 2009, 14:57

Bonjour à tous.

J'ai souhaité faire un système d'inscription sur mon site en m'aidant de ce tuto :

http://www.asp-php.net/tutorial/asp-php ... php?page=2

Cependant, j'ai une erreur avec ce code : Une erreur est survenue lors de la création de votre compte utilisateur!! J'ai rajouté deux points d'exclamations pour différencier les deux erreurs qui ont dans le script le même message d'erreur. ;)

Sans plus attendre, je vous présente mon script.

Merci de m'aider.
<?

if(isset($_COOKIE["ID_UTILISATEUR"]))
{
     header("Location: index.php");
}

?>

<?

// Redirige l'utilisateur s'il est déjà identifié
if(isset($_COOKIE["ID_UTILISATEUR"]))
{
     header("Location: index.php");
}
else
{
     
     // Formulaire visible par défaut
     $masquer_formulaire = false;
     
     // Une fois le formulaire envoyé
     if(isset($_POST["BT_Envoyer"]))
     {
          
          // Vérification de la validité des champs
          if(!ereg("^[A-Za-z0-9_]{4,20}$", $_POST["TB_Nom_Utilisateur"]))
          {
               $message = "Votre nom d'utilisateur doit comporter entre 4 et 20 caractères<br />\n";
               $message .= "L'utilisation de l'underscore est autorisée";
          }
          elseif(!ereg("^[A-Za-z0-9]{4,}$", $_POST["TB_Mot_de_Passe"]))
          {
               $message = "Votre mot de passe doit comporter au moins 4 caractères";
          }
          elseif($_POST["TB_Mot_de_Passe"] != $_POST["TB_Confirmation_Mot_de_Passe"])
          {
               $message = "Votre mot de passe n'a pas été correctement confirmé";
          }
          elseif(!ereg("^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]{2,}[.][a-zA-Z]{2,4}$",
               $_POST["TB_Adresse_Email"]))
          {
               $message = "Votre adresse e-mail n'est pas valide";
          }
          else
          {
               
               // Connexion à la base de données
               // Valeurs à modifier selon vos paramètres configuration
               mysql_connect("****", "****", "****");
               mysql_select_db("ID_Utilisateur");
               
               // Vérification de l'unicité du nom d'utilisateur et de l'adresse e-mail
               $result = mysql_query("
                    SELECT Nom_Utilisateur
                         , Adresse_Email
                    FROM ID_Utilisateur
                    WHERE Nom_Utilisateur = '" . $_POST["TB_Nom_Utilisateur"] . "'
                    OR Adresse_Email = '" . $_POST["TB_Adresse_Email"] . "'
               ");
               
               // Si une erreur survient
if(mysql_errno()>0)
               {
                    $message = "Une erreur est survenue lors de la création de votre compte utilisateur (".mysql_error().")";
               }


               else
               {
                    
                    // Si un enregistrement est trouvé
                    if(mysql_num_rows($result) > 0)
                    {
                         
                         while($row = mysql_fetch_array($result))
                         {
                              
                              if($_POST["TB_Nom_Utilisateur"] == $row["Nom_Utilisateur"])
                              {
                                   $message = "Le nom d'utilisateur " . $_POST["TB_Nom_Utilisateur"];
                                   $message .= "est déjà utilisé";
                              }
                              elseif($_POST["TB_Adresse_Email"] == $row["Adresse_Email"])
                              {
                                   $message = "L'adresse e-mail " . $_POST["TB_Adresse_Email"];
                                   $message .= "est déjà utilisée";
                              }
                              
                         }
                         
                    }
                    else
                    {
                         
                         // Génération de la clef d'activation
                         $caracteres = array("a", "b", "c", "d", "e", "f", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
                         $caracteres_aleatoires = array_rand($caracteres, 8);
                         $clef_activation = "";
                         
                         foreach($caracteres_aleatoires as $i)
                         {
                              $clef_activation .= $caracteres[$i];
                         }
                         
                         // Création du compte utilisateur
                         $result = mysql_query("
                              INSERT INTO Comptes_Utilisateurs(
                                   Nom_Utilisateur
                                   , Mot_de_Passe
                                   , Adresse_Email
                                   , Date_Inscription
                                   , Clef_Activation
                              )
                              VALUES(
                                   '" . $_POST["TB_Nom_Utilisateur"] . "'
                                   , '" . md5($_POST["TB_Mot_de_Passe"]) . "'
                                   , '" . $_POST["TB_Adresse_Email"] . "'
                                   , '" . time() . "'
                                   , '" . $clef_activation . "'
                              )
                         ");
                         
                         // Si une erreur survient
                         if(!$result)
                         {
                              $message = "Une erreur est survenue lors de la création de votre compte utilisateur!!";
                         }
                         else
                         {
                              
                              // Envoi du mail d'activation
                              $sujet = "Activation de votre compte utilisateur";
                              
                              $message = "Pour valider votre inscription, merci de cliquer sur le lien suivant :\n";
                              $message .= "http://" . $_SERVER["SERVER_NAME"];
                              $message .= "/activer-compte-utilisateur.php?id=" . mysql_insert_id();
                              $message .= "&clef=" . $clef_activation;
                              
                              // Si une erreur survient
                              if(!@mail($_POST["TB_Adresse_Email"], $sujet, $message))
                              {
                                   $message = "Une erreur est survenue lors de l'envoi du mail d'activation<br />\n";
                                   $message .= "Veuillez contacter l'administrateur afin d'activer votre compte";
                              }
                              else
                              {
                                   
                                   // Message de confirmation
                                   $message = "Votre compte utilisateur a correctement été créer<br />\n";
                                   $message .= "Un email vient de vous être envoyer afin de l'activer";
                                   
                                   // On masque le formulaire
                                   $masquer_formulaire = true;
                                   
                              }
                              
                         }
                         
                    }
                    
               }
               
          }
          
          // Fermeture de la connexion à la base de données
          mysql_close();
          
     }
     
}

?>
Merci de vous intéresser à mon problème. ;)

Bonne journée. :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mars 2009, 15:17

Si tu obtiens ce message, c'est que ton script est passé par la condition if(!$result).

Par conséquent, le résultat contenu dans $result ne semble pas correct. Cela veut dire que la valeur retournée par mysql_query() est incorrect et qu'il y a probablement une erreur dans ta requête d'insertion.

Tu peux le vérifier en affichant la requête générée et en essayant de l'exécuter dans MySQL ou phpMyAdmin, ou en vérifiant s'il n'y a pas eu d'erreur lors de son exécution avec mysql_error() (comme tu l'as fait pour le select ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 141 Messages

23 mars 2009, 15:18

Ajoute un
echo "
                              INSERT INTO Comptes_Utilisateurs(
                                   Nom_Utilisateur
                                   , Mot_de_Passe
                                   , Adresse_Email
                                   , Date_Inscription
                                   , Clef_Activation
                              )
                              VALUES(
                                   '" . $_POST["TB_Nom_Utilisateur"] . "'
                                   , '" . md5($_POST["TB_Mot_de_Passe"]) . "'
                                   , '" . $_POST["TB_Adresse_Email"] . "'
                                   , '" . time() . "'
                                   , '" . $clef_activation . "'
                              )
                         "
au dessus de l'affichage de l'erreur
// Si une erreur survient
                         if(!$result)
                         {
                              $message = "Une erreur est survenue lors de la création de votre compte utilisateur!!";
                         } 

Eléphant du PHP | 75 Messages

23 mars 2009, 15:39

Merci pour la rapidité de vos réponses, ça fait plaisir. :)

@Ryle : Je vais regarder dans la console PHP MyAdmin voir comment on exécute ma commande. :)

@Julian : Quand j'ajoute ton script, j'ai le droit à : Parse error: syntax error, unexpected T_IF, expecting ',' or ';' in /mnt/102/sda/4/3/jnewb/inscription.php on line 143

Pour info la ligne 143 et aux alentours, ça donne ça :
                         // Si une erreur survient
                         if(!$result)
                         {
                              $message = "Une erreur est survenue lors de la création de votre compte utilisateur!!";
                         }

Merci. ;)

Edit : @Ryle : Je suis débutant en PHP et je n'ai pas trouvé comment exécuter une fonction dans ma console PHP MyAdmin. :/

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 mars 2009, 16:18

@Julian : Quand j'ajoute ton script, j'ai le droit à : Parse error: syntax error, unexpected T_IF, expecting ',' or ';' in /mnt/102/sda/4/3/jnewb/inscription.php on line 143
Ce message d'erreur dit, une fois traduit :
"Je n'attendais pas un if, mais une virgule "," ou un point-virgule ";""

C'est donc qu'il manque un caractère de fin de ligne avant le if.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 75 Messages

23 mars 2009, 16:31

En effet une fois l'ajout d'un ";", je n'ai plus l'erreur. :D

Cependant, quand je tente de m'inscrire j'ai toujours le droit à la même erreur, mais en plus, j'ai :

"INSERT INTO Comptes_Utilisateurs( Nom_Utilisateur , Mot_de_Passe , Adresse_Email , Date_Inscription , Clef_Activation ) VALUES( 'Mon Pseudo' , 'Mot De Passe Crypté' , 'Mon eMail' , '1237818552' , 'ac124678' ) "

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mars 2009, 16:36

Le but de cette instruction est en effet d'afficher la requête telle qu'elle est envoyée à MySQL (et donc de voir les valeurs que tu lui envois). C'est uniquement pour du débuggage et tu pourras la vider ensuite ;)

Une fois la requête affichée à l'écran, tu peux la copier/coller sous phpMyAdmin et vérifier si son exécution ne provoque pas d'erreur (ce qui justifierait pourquoi $result ne contient pas la bonne valeur).

A partir de là et selon le message d'erreur tu pourras voir si c'est un problème dans le nom de la table, dans le nom d'un champ, dans la taille d'un champ, etc... et donc corriger ton code en conséquence :)

Edit : par exemple si ta date est un champ de type "date" dans mysql alors la valeur "1237818552" que tu essayes d'y insérer n'est pas au bon format (aaaa-mm-jj)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 75 Messages

23 mars 2009, 16:49

Alors alors. :)

Quand je veux exécuter ma requête sous MyAdmin, je vais dans l'onglet SQL, c'est bien ça ? :)

Après je choisis quelle champ je veux exécuter, je clique sur le bouton "<<" pour afficher le champ. Le délimiteur est par défaut avec un ";" je laisse ça comme ça ?

Ensuite je clique sur Executer et à chaque fois je tombe sur une erreur du type :

#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 '`Nom_Utilisateur` SELECT * FROM `ID_Utilisateur` WHERE 1 `ID_Utilisateur`
LIMI' at line 1

Et ce pour tous les champs... :d

je sens qu'il va falloire être patient avec moi :P

En tout cas merci de m'aider. :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mars 2009, 17:56

Alors en fait tu as tout bon jusqu'à la selection des champs. En effet, dans le cas présent, on ne veut pas faire un select pour connaitre les valeurs des enregistrements en base, mais on veut tester la requête affichée par ton script pour voir si elle passe ou pas :)

Donc dans le formulaire sql, tu vires tout ce que tu peux trouver (les SELECT * FROM ...), tu colles ta requête et tu l'exécutes pour voir si elle s'insère bien. Si c'est le cas, c'est que le problème de ton script est lié à la connexion avec la base de données. S'il y a une erreur, bah il te donnera un message te permettant d'identifier le problème et de le corriger ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 75 Messages

23 mars 2009, 18:32

Okay :)

Alors voilà ce que j'ai fait (j'espère que c'est bon :p)

J'ai copié / collé
$result = mysql_query("
                              INSERT INTO Comptes_Utilisateurs(
                                   Nom_Utilisateur
                                   , Mot_de_Passe
                                   , Adresse_Email
                                   , Date_Inscription
                                   , Clef_Activation
                              )
                              VALUES(
                                   '" . $_POST["TB_Nom_Utilisateur"] . "'
                                   , '" . md5($_POST["TB_Mot_de_Passe"]) . "'
                                   , '" . $_POST["TB_Adresse_Email"] . "'
                                   , '" . time() . "'
                                   , '" . $clef_activation . "'
                              )
                         ");
Et j'ai exécuté la chose :p

Et ça me donne ça :
requête SQL:

$result = mysql_query(
"
                              INSERT INTO Comptes_Utilisateurs(
                                   Nom_Utilisateur
                                   , Mot_de_Passe
                                   , Adresse_Email
                                   , Date_Inscription
                                   , Clef_Activation
                              )
                              VALUES(
                                   '".$_POST[ "TB_Nom_Utilisateur"]. "'
                                   , '".md5(
$_POST[ "TB_Mot_de_Passe"]
). "'
                                   , '".$_POST[ "TB_Adresse_Email"]. "'
                                   , '".time(
). "'
                                   , '".$clef_activation. "'
                              )
                         "
)

MySQL a répondu:

#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 '$result = mysql_query("
                              INSERT INTO Comptes_Utili' at line 1 

Voilà voilà. :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mars 2009, 19:41

Ah bah ouais mais non...... c'est pas ton code php que mysql doit tester :)

C'est le code sql que php lui envoi qu'il faut vérifier. Et pour connaitre le code SQL que php envoi à MySQL, il faut l'afficher : c'est ce que t'as fait faire Julian.

Donc normalement c'est ta requête :

Code : Tout sélectionner

INSERT INTO Comptes_Utilisateurs( Nom_Utilisateur , Mot_de_Passe , Adresse_Email , Date_Inscription , Clef_Activation ) VALUES( 'Mon Pseudo' , 'Mot De Passe Crypté' , 'Mon eMail' , '1237818552' , 'ac124678' )
qu'il faut essayer de jouer dans phpMyAdmin :)
(enfin la vrai, celle qui est affichée à ton écran, parce que 'Mot De Passe Crypté' m'a pas l'air d'être véritablement une chaine cryptée en md5 ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 75 Messages

23 mars 2009, 19:44

TADAM ! :D
Erreur
requête SQL:

INSERT INTO Comptes_Utilisateurs( Nom_Utilisateur, Mot_de_Passe, Adresse_Email, Date_Inscription, Clef_Activation ) 
VALUES (
'Jean',  'c4e5e086e8ddf70272926014cacd83c6',  '[email protected]',  '1237830211',  '5a39462f'
)

MySQL a répondu:

#1146 - Table 'jnewb.Comptes_Utilisateurs' doesn't exist

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mars 2009, 19:53

Et ben voilà ! Maintenant tu sais pourquoi ça ne fonctionne pas ! :)

comment ça "non" ? :x

Il vient pourtant de te le dire : la Table "Comptes_Utilisateurs" n'existe pas dans la base "jnewb" :)

Alors petitah, est-ce que tu es bien connecté à la bonne base de données (jnewb) et petitbéh,
as-tu bien une table nommée "Comptes_Utilisateurs" dans cette base (attention aux s, aux majuscules/minuscules, etc.)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 75 Messages

23 mars 2009, 20:15

En effet, cette table est manquante... :/

D'ailleurs dans ce tuto la table n'est pas non plus présente... :/

Tu n'aurais pas une petite idée de quoi mettre dans cette table par hasard ? :d

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mars 2009, 21:28

J'en ai même une bonne idée ;) Mais si je te le dis tout de suite, ca sera pas drôle... :P

Alors partons du principe qu'un tuto peut contenir des bugs, des coquilles ou des bizareries (sauf sur phpfrance naturellement, si tel était le cas, elle serait nécessairement voulu par l'auteur et viserait à tester l'internaute, si si ! ;))

Maintenant et pour te mettre sur la piste, regardons ce qu'est sensé faire ton script. Le but est d'enregistrer un utilisateur dans une table de ta base de données. Actuellement ton script :
- récupère les données du formulaire
- vérifie la validité des champs
- se connecte à la base de données
- Vérifie si le nom d'utilisateur et l'adresse existent déjà dans la table des utilisateurs
- et si aucun enregistrement n'est trouvé, va générer la clé d'activation et ajouter l'utilisateur dans la table des utilisateurs

Sachant que l'erreur que tu rencontres vient de cette dernière étape, alors que tu essayes d'insérer ton utilisateur dans une table nommée "Comptes_Utilisateurs" qui n'existe pas, dans quelle table existante devrais-tu logiquement stocker ces informations... et pourquoi ? :) (relis le début du code, regardes bien les étapes, la réponse est dedans ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...