Page 1 sur 1

Probléme de débutant

Posté : 01 nov. 2010, 23:24
par Andromede86
Bonsoir à tous,
voilà ça fait une heure que je me prends la tête sur quelques chose de très simple, je débute en php et j'étais en train de tester un l'aide d'un tutoriel la réalisation d'un formulaire d'inscription.

J'ai créer une base de donnée avec ce code :

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `Comptes_Utilisateurs` ( `Id_utilisateur` bigint(20) NOT NULL auto_increment, `Nom_Utilisateur` varchar(20) NOT NULL, `Mot_de_Pass` varchar(32) NOT NULL, `Adresse_Email` varchar(255) NOT NULL, `Date_Inscription` int(10) NOT NULL default '0', `Compte_Active` enum('0','1') NOT NULL default '0', `Clef_Activation` varchar(8) NOT NULL, KEY `Id_utilisateur` (`Id_utilisateur`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
suivi d'une page codée (et une autre pour l'accès à la BDD)

Code : Tout sélectionner

<?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ée 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_Pass"])) { $message = "Votre mot de passe doit comporter au moins 4 caractéres"; } elseif($_POST["TB_Mot_de_Pass"] != $_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"; } //elseif(!ereg("[1-5]", $_POST["TB_Force"])) //{ // $message = "Votre force doit être différente de 0"; //} else { // Connexion à  la base de donéees // Valeurs à  modifier selon vos paramêtres configuration include 'secur/config.php'; mysql_connect("$serveur", "$login", "$motdepasse"); mysql_select_db("$nom_base"); // Vérification de l'unicité du nom d'utilisateur et de l'adresse e-mail $result = mysql_query(" SELECT Nom_Utilisateur , Adresse_Email FROM Comptes_Utilisateurs WHERE Nom_Utilisateur = '" . $_POST["TB_Nom_Utilisateur"] . "' OR Adresse_Email = '" . $_POST["TB_Adresse_Email"] . "' "); // Si une erreur survient if(!$result) { $message = "Erreur d'accès à la base de données lors de la vérification d'unicité"; } 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_Pass , Adresse_Email , Date_Inscription , Clef_Activation ) VALUES( '" . $_POST["TB_Nom_Utilisateur"] . "' , '" . md5($_POST["TB_Mot_de_Pass"]) . "' , '" . $_POST["TB_Adresse_Email"] . "' , '" . time() . "' , '" . $clef_activation . "' ) "); // Si une erreur survient if(!$result) { $message = "Erreur d'accès à la base de données lors de la création du 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(); } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>[PHP] Créer un espace membre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <?php if(isset($message)) { ?> <p><?php echo $message; ?></p> <?php } if($masquer_formulaire != true) { ?> <form action="http://<?php echo $_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME"]; ?>" method="post"> <p> Nom d'utilisateur : <input type="text" name="TB_Nom_Utilisateur" /> </p> <p> Mot de passe : <input type="password" name="TB_Mot_de_Pass" /> </p> <p> Confirmation du mot de passe : <input type="password" name="TB_Confirmation_Mot_de_Passe" /> </p> <p> Adresse e-mail : <input type="text" name="TB_Adresse_Email" /> </p> <p> <input type="submit" name="BT_Envoyer" value="Envoyer" /> </p> </form> <?php } ?> </body> </html>
jusque là ça fonctionne parfaitement... Content de moi je décide de refaire la même chose en ajoutant une autre entrée que celle du tutos, une entrée "force" par exemple.

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `Comptes_Utilisateurs` ( `Id_utilisateur` bigint(20) NOT NULL auto_increment, `Nom_Utilisateur` varchar(20) NOT NULL, `Mot_de_Pass` varchar(32) NOT NULL, `Adresse_Email` varchar(255) NOT NULL, `Force` varchar(255) NOT NULL, `Date_Inscription` int(10) NOT NULL default '0', `Compte_Active` enum('0','1') NOT NULL default '0', `Clef_Activation` varchar(8) NOT NULL, KEY `Id_utilisateur` (`Id_utilisateur`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Ensuite sur le même modèle et la même idée j'ajoute aussi dans la page du code :

Code : Tout sélectionner

<?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ée 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_Pass"])) { $message = "Votre mot de passe doit comporter au moins 4 caractéres"; } elseif($_POST["TB_Mot_de_Pass"] != $_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"; } //elseif(!ereg("[1-5]", $_POST["TB_Force"])) //{ // $message = "Votre force doit être différente de 0"; //} else { // Connexion à  la base de donéees // Valeurs à  modifier selon vos paramêtres configuration include 'secur/config.php'; mysql_connect("$serveur", "$login", "$motdepasse"); mysql_select_db("$nom_base"); // Vérification de l'unicité du nom d'utilisateur et de l'adresse e-mail $result = mysql_query(" SELECT Nom_Utilisateur , Adresse_Email FROM Comptes_Utilisateurs WHERE Nom_Utilisateur = '" . $_POST["TB_Nom_Utilisateur"] . "' OR Adresse_Email = '" . $_POST["TB_Adresse_Email"] . "' "); // Si une erreur survient if(!$result) { $message = "Erreur d'accès à la base de données lors de la vérification d'unicité"; } 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_Pass , Force , Adresse_Email , Date_Inscription , Clef_Activation ) VALUES( '" . $_POST["TB_Nom_Utilisateur"] . "' , '" . md5($_POST["TB_Mot_de_Pass"]) . "' , '" . $_POST["TB_Adresse_Email"] . "' , '" . $_POST["TB_Force"] . "' , '" . time() . "' , '" . $clef_activation . "' ) "); // Si une erreur survient if(!$result) { $message = "Erreur d'accès à la base de données lors de la création du 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(); } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>[PHP] Créer un espace membre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <?php if(isset($message)) { ?> <p><?php echo $message; ?></p> <?php } if($masquer_formulaire != true) { ?> <form action="http://<?php echo $_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME"]; ?>" method="post"> <p> Nom d'utilisateur : <input type="text" name="TB_Nom_Utilisateur" /> </p> <p> Mot de passe : <input type="password" name="TB_Mot_de_Pass" /> </p> <p> Confirmation du mot de passe : <input type="password" name="TB_Confirmation_Mot_de_Passe" /> </p> <p> Adresse e-mail : <input type="text" name="TB_Adresse_Email" /> </p> <p> Force : <input type="text" name="TB_Force" /> </p> <p> <input type="submit" name="BT_Envoyer" value="Envoyer" /> </p> </form> <?php } ?> </body> </html>
et là problème ça me retourne systématiquement à l'inscription d'un membre "Erreur d'accès à la base de données lors de la création du compte utilisateur"... Je ne comprends vraiment pas pourquoi, c'est exactement la même chose avec des lignes en plus sur le même modèle... Enfin autre chose depuis mon ajout quand je remplis un champ de la mauvaise façon ça m'affiche "Warning: mysql_close(): no MySQL-Link resource supplied in /homez.33/endromed/www/test/creer-compte-utilisateur.php on line 164", se qui ne se produisait pas dans le premier cas :shock: .

Merci d'avance pour votre aide.

Re: Probléme de débutant

Posté : 01 nov. 2010, 23:39
par moogli
salut,

dans le code de vérification du formulaire modifie le mysql_query ligne 102 ainsi
<?php
 $requete = "
                              INSERT INTO Comptes_Utilisateurs(
                                   Nom_Utilisateur
                                   , Mot_de_Pass
                    , Force
                                   , Adresse_Email
                                   , Date_Inscription
                                   , Clef_Activation
                              )
                              VALUES(
                                   '" . $_POST["TB_Nom_Utilisateur"] . "'
                                   , '" . md5($_POST["TB_Mot_de_Pass"]) . "'
                                   , '" . $_POST["TB_Adresse_Email"] . "'
                                   , '" . $_POST["TB_Force"] . "'
                                   , '" . time() . "'
                                   , '" . $clef_activation . "'
                              )
                         ";
                         $result = mysql_query($requete);
                         
                         // Si une erreur survient
                         if(!$result)
                         {
                              $message = "Erreur d'accès à la base de données lors de la création du compte utilisateur <br /> message".mysql_error().'<br />Avec la requete .'$requete;
                         }
?>
cela va te fournir un message d'erreur exploitable afin de corriger l'erreur.

@+

Re: Probléme de débutant

Posté : 01 nov. 2010, 23:53
par Invité
Salut, merci pour ta réponse rapide. Voilà le message que celà me donne :

" 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 'Force, Adresse_Email, Date_Inscription, Clef_Activation) ' at line 1 "

J'ai du mal à comprendre se que je dois faire, il me dit que c'est la requête SQL qui n'est pas bonne en faite c'est ça ? Et je dois faire quoi :(

Re: Probléme de débutant

Posté : 02 nov. 2010, 00:11
par moogli
faudrait le reste du message
j'ai intervertis un . et un ' le
$message = 'Erreur d'accès à la base de données lors de la création du compte utilisateur <br /> message : ' .mysql_error().'<br />Avec la requête' .$requete;

pour le debug tu peu direct mettre echo $message; pour avoir le message complet.

le problème vient du fait que la requête est "foireuse", => force est un mot clef pour mysql c'est pour cela que la requête plante. ajoute des ` autour ou change le nom du champ

Code : Tout sélectionner

INSERT INTO Comptes_Utilisateurs ( Nom_Utilisateur, Mot_de_Pass, `Force`, Adresse_Email, Date_Inscription, Clef_Activation ....
Edit : Dsl pas pensé plutôt au mot clef ;)
@+

Re: Probléme de débutant

Posté : 03 nov. 2010, 11:56
par Alphacentor
Salut,
C'était exactement ça :D , merci beaucoup ! J'en perdais mon latin héhé.