Page 1 sur 2

Système d'inscription sur son site.

Posté : 23 mars 2009, 14:57
par JeanJean
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. :)

Posté : 23 mars 2009, 15:17
par Ryle
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 ;))

Posté : 23 mars 2009, 15:18
par julian
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!!";
                         } 

Posté : 23 mars 2009, 15:39
par JeanJean
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. :/

Posté : 23 mars 2009, 16:18
par zeus
@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.

Posté : 23 mars 2009, 16:31
par JeanJean
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' ) "

Posté : 23 mars 2009, 16:36
par Ryle
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)

Posté : 23 mars 2009, 16:49
par JeanJean
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. :)

Posté : 23 mars 2009, 17:56
par Ryle
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 ;)

Posté : 23 mars 2009, 18:32
par JeanJean
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à. :)

Posté : 23 mars 2009, 19:41
par Ryle
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 ;))

Posté : 23 mars 2009, 19:44
par JeanJean
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

Posté : 23 mars 2009, 19:53
par Ryle
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.)

Posté : 23 mars 2009, 20:15
par JeanJean
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

Posté : 23 mars 2009, 21:28
par Ryle
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 ;))