Formulaire d'inscription affichage erreurs ou confirmation

Eléphant du PHP | 254 Messages

16 mars 2006, 17:52

Bonjour
Je travaille à essayer de développer un espace membres.
Je voudrais l'optimiser
Les inscriptions fonctionnent, mais je n'arrive pas à afficher de message de résultat, qu'un message d'erreur. D'autre part, je souhaiterai qu'en cas d'erreur, dans mon cas : mail existant déjà dans la base, que la personne n'ai pas à retaper tous les champs.
J'ai essayé de faire un echo de variables de formulaire, mais bien évidemment, lorsque l'on se rend pour la première fois sur le formulaire, les champs indiquent une erreur : undefined index 'nom'....etc.
Voici le code d'inscription.php
<?php require_once('includes/xxxxx.php'); ?>
<?php
//init des variables
if(!isset ($_POST['id'])) $id=""; else $id=htmlentities($_POST['id']);
if(!isset ($_POST['nom'])) $nom=""; else $nom=htmlentities($_POST['nom']);
if(!isset ($_POST['prenom'])) $prenom=""; else $prenom=htmlentities($_POST['prenom']);
if(!isset ($_POST['login'])) $login=""; else $login=htmlentities($_POST['login']);
if(!isset ($_POST['pass'])) $pass=""; else $pass=htmlentities($_POST['pass']);
if(!isset ($_POST['pass2'])) $pass2=""; else $pass2=htmlentities($_POST['pass2']);
if(!isset ($_POST['adresse'])) $adresse=""; else $adresse=htmlentities($_POST['adresse']);
if(!isset ($_POST['code_postal'])) $code_postal=""; else $code_postal=htmlentities($_POST['code_postal']);
if(!isset ($_POST['ville'])) $ville=""; else $ville=htmlentities($_POST['ville']);
if(!isset ($_POST['email'])) $email=""; else $email=htmlentities($_POST['email']);
if(!isset ($_POST['naissance'])) $naissance=""; else $naissance=htmlentities($_POST['naissance']);
if(!isset ($_POST['ajoutMembre'])) $ajoutMembre="non"; else $ajoutMembre=$_POST['ajoutMembre'];
if(!isset($erreur_Membre)) $erreur_Membre=0; 
if(!isset($_POST['ajoutMembre'])) $ajoutMembre=""; else $ajoutMembre=$_POST['ajoutMembre'];
?>
<?php
if ($ajoutMembre=="ok")
{
	//sélection de la base de données
	mysql_select_db($database, $xxxx);
	//vérification si le mail existe déjà dans la base
	$query_Membre = "SELECT email FROM membres WHERE email = '$email' ";
	$Membre = mysql_query($query_rsMembre, $xxxx) or die(mysql_error());
	$totalRows_Membre = mysql_num_rows($Membre);
	//si le mail n'existe pas encore alors : 
	if ($totalRows_Membre==0)
		{
	//enregistrement dans la base du nouveau compte client
	mysql_select_db($database, $xxxx);
	$insertMembre = "INSERT INTO membres (nom, prenom, login, pass, pass2, adresse, code_postal, ville, email, naissance) VALUES ('$nom', '$prenom', '$login', '$pass', '$pass2', '$adresse', '$code_postal', '$ville', '$email', '$naissance')";
	mysql_query($insertMembre, $xxxx) or die(mysql_error()); 
	//redirection vers la page inscription 
                header("Location: inscription.php");	
	}//fin du if 
    //si l'email existe déjà > message d'erreur
	else
		{
		$erreur_Membre=1;
		}
}
?>
et ici la suite de la page et le formulaire :
<div id="messages">
<?php // script d'affichage d'erreur
if ($erreur_Membre==1)
{
?>
<span class="Style4 Style13">Ce mail<strong> <?php echo $email ?> </strong>existe d&eacute;j&agrave; dans notre base membres. <strong><br /></strong>Choississez un autre mail et réinscrivez vous.</span><br /><br />
<?php
$erreur_Membre=0; // raz du drapeau d'erreur
}
?>
</div>
.../...
<fieldset>
   <legend class="Style11">Formulaire d'inscription</legend>
          <form action="inscription.php" method="post" enctype="" name="form" id="form">
          <table width="346" align="center" cellpadding="3" cellspacing="0">
            <tr>
              <td width="208" class="Style4"><div align="left">Nom * </div></td>
              <td width="124"><div align="left"><input name="nom" type="text" class="form" id="nom" value="<?php echo $_POST['nom']; ?>" /></div></td>
            </tr>
            <tr>
              <td class="Style4"><div align="left">Pr&eacute;nom * </div></td>
              <td><div align="left"><input name="prenom" type="text" class="form" value="<?php echo $_POST['prenom']; ?>" /></div></td>
            </tr>
            <tr>
              <td class="Style4"><div align="left">Identifiant * </div></td>
              <td><div align="left"><input name="login" type="text" class="form" value="<?php echo $_POST['login']; ?>"  /></div></td>
            </tr>
            <tr>
              <td class="Style4"><div align="left">Mot de passe * </div></td>
              <td><div align="left"><input name="pass" type="password" class="form" id="pass" /></div></td>
            </tr>
            <tr>
              <td class="Style4"><div align="left">V&eacute;rification * </div></td>
              <td><div align="left"><input name="pass2" type="password" class="form" /></div></td>
            </tr>
            <tr>
              <td class="Style4"><div align="left">Adresse</div></td>
              <td><div align="left"><textarea name="adresse" cols="21" rows="3" class="form" ></textarea></div></td>
            </tr>
            <tr>
              <td class="Style4"><div align="left">Code postal</div></td>
              <td><div align="left"><input name="code_postal" type="text" class="form" maxlength="5" /></div></td>
            </tr>
            <tr>
              <td class="Style4"><div align="left">Ville</div></td>
              <td><div align="left"><input name="ville" type="text" class="form" /></div></td>
            </tr>
            <tr>
              <td class="Style4"><div align="left">Email * </div></td>
              <td><div align="left"><input name="email" type="text" class="form" value="" /></div></td>
            </tr>
            <tr><td class="Style4"><div align="left">T&eacute;l&eacute;phone * </div></td>
              <td><div align="left"><input name="tel" type="text" class="form" value="" /></div></td>
            </tr>
            <tr>
              <td class="Style4"><div align="left">Date de naissance </div></td>
              <td><div align="left"><input name="naissance" type="text" class="form" value=""></div></td>
            </tr>
            <tr>
              <td><input name="ajoutMembre" type="hidden" id="ajoutMembre" value="ok" />
                <input name="action" type="hidden" id="action" value="1" /></td>
              <td><input name="inscription" type="submit" id="inscription" onclick="valider()" value="valider" /></td>
            </tr>
          </table>
          </form>
</fieldset>
        <p align="justify">* Champs obligatoires</p>
Une petite idée pour m'aiguiller ou me corriger ? Merci d'avance !
Modifié en dernier par coxine le 17 mars 2006, 14:31, modifié 1 fois.

Eléphant du PHP | 254 Messages

16 mars 2006, 18:03

Dans mon form, au lieu de faire
<?php echo $_POST['nom']; ?>
J'ai fait :
<?php echo $nom;?>
:oops:
Donc ça c'est cool, mais je n'arrive pas à afficher de message de bienvenue.

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

16 mars 2006, 18:18

Pour ton message de bienvenue, tu peux par exemple dans le header qui suit l'insertion en base, ajouter une variable qui te permettra de savoir que le traitement s'est bien passé, et afficher le message correspondant :)
header("Location: inscription.php?succes=true");
Il te suffit alors d'un test dans ta page inscription.php pour afficher le message qui va bien :
if(isSet($_GET['succes']) && $_GET['succes']) {
  echo "Il est des noootreuuuhh il s'est inscrit comme les auuuttreeuuuuh !!"; 
  // exemple de message non contractuel ;)
}

Eléphant du PHP | 254 Messages

16 mars 2006, 18:22

Coucou Ryle !
Chuis mdr à chaque fois avec tes messages de bienvenue !
;-)
Merci je vais essayer !!!! :D

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

16 mars 2006, 18:41

Coucou Ryle !
Chuis mdr à chaque fois avec tes messages de bienvenue !
;-)
Bah quoi ? Il est pas bien mon message de bienvenue ? ;)

Je fais aussi de très bons messages d'erreur si jamais tu as besoin : "Une erreur innattendue a été sournoisement provoquée par un individu très certainement malveillant ! Veuillez changer l'utilisateur et cliquer sur continuer" :)

Ceci dit, vous remarquerez lorsque vous devez corriger un problème, que bien souvent, l'erreur est située entre la chaise et le clavier ;)

Eléphant du PHP | 254 Messages

16 mars 2006, 18:43

bon, je vais essayer maintenant d'envoyer un mail de confirmation d'inscription qui récupère les login et mot de passe.
Heu, juste une autre question :
Si je veux afficher dans le message :
<?php if(isSet($_GET['succes']) && $_GET['succes']) 
{ //affichage du message d'inscription réussie
?>
<span class="Style15">Votre inscription a été prise en compte ! </span> <?php echo $prenom; echo $nom; ?>
<?php
}
?>
les noms et prénoms ne s'affichent pas.
Le formulaire a bien été envoyé, donc normalement je devrais pouvoir récupérer les variables de formulaire, non ?
Je dois faire une erreur d'écriture dans le print.... :roll: [/php]

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

16 mars 2006, 19:38

Nope, lorsque tu utilise le header, tu rediriges vers une nouvelle page (même si c'est la même) mais les données ne suivent pas si tu ne les renvois pas également.

Tu peux donc soit les faire suivre dans le header :
header("Location: inscription.php?succes=true&nom=$nom&prenom=$prenom");
Et récupérer $_GET['nom'], etc. pour les afficher dans ton message,

Soit (et c'est à mon avis plus propre) quand ils s'inscrivent, après l'insert, mais avant d'appeller le header, placer les infos en session (comme dans l'authentification qui n'a désormais plus de secret pour toi ;)) et du coup lorsque tu reviens sur ta page, il suffit de démarrer la session et d'appeller tes variables dans $_SESSION :)

Soit enfin, si tout est sur la même page (je crois que c'est ton cas) enlever le header (donc pas de redirection, on laisse poursuivre l'éxécution jusqu'au bout), et le remplacer par un flag qui te permettra de savoir que l'utilisateur a réussi à s'authentifier (genre $succes_Membre=1)
Du coup au lieu du $_GET['succes'], tu testes directement $succes_Membre :)

Eléphant du PHP | 254 Messages

16 mars 2006, 20:05

oui je me disais bien que la session n'existait pas !
Je pense plutôt indiquer un flag du genre :
Votre inscription a été prise en compte, vous allez recevoir un email pour la confirmer...et m'attaquer à un script de mail ;-)
Je regarde qques posts par ci, par là pour m'en inspirer, et je reviendrais asap!
Idem pour mot de passe perdu ;-), envoi d'un mail avec les données !Pfiou :roll:
Merci merci de ton aide :oops:

Eléphant du PHP | 254 Messages

17 mars 2006, 11:27

j'ai un peu avancé, mais en fait, je butte sur l'écriture des flags.
J'ai des erreurs qui ressemblent à ça :

Notice: Use of undefined constant succes_Membre - assumed 'succes_Membre' in d:\programmes\easyphp1-8\www\xxxx\inscription.php on line 162
<?php
if ($ajoutMembre=="ok")
{
	//sélection de la base de données
	mysql_select_db($database, $connexion);
	//vérification si le mail existe déjà dans la base
	$query_Membre = "SELECT email FROM membres WHERE email = '$email' ";
	$Membre = mysql_query($query_Membre, $connexion) or die(mysql_error());
	$totalRows_Membre = mysql_num_rows($Membre);
	//si le mail n'existe pas encore alors : 
	if ($totalRows_Membre==0)
		{
			//enregistrement dans la base du nouveau compte client
			mysql_select_db($database, $connexion);
			$insertMembre = "INSERT INTO membres (nom, prenom, login, pass, pass2, adresse, code_postal, ville, email, naissance) VALUES ('$nom', '$prenom', '$login', '$pass', '$pass2', '$adresse', '$code_postal', '$ville', '$email', '$naissance')";
			mysql_query($insertMembre, $connexion) or die(mysql_error()); 
			$adresse = $email; 
            $titre = "Confirmation d'inscription"; 
            $headers="From : ma pomme \n"; 
            $message = "Bienvenue sur notre site ! 

Nous vous confirmons votre inscription sur le site : 
Merci de bien conserver ce mail,\n il contient vos identifiants et mot de passe pour accéder à votre espace personnel :\n

Votre login est : ".$login." \n
Votre pass est : ".$pass2." \n

Pour vous connecter sur le site et acceder a votre profil vous devez d'abord cliquer sur le lien suivant : 
http://www........"; 

                mail($adresse,$titre,$message,$headers); 
				$succes_Membre=1;
		}//fin du if 
    //si l'email existe déjà > message d'erreur
	else
		{
		$erreur_Membre=1;
		}
		
}
?>
Je patauge complètement...J'ai enlevé le header, car j'ai pigé que ce n'est pas la peine puisqu'on reste sur la même page :oops: que cela ferme une session, si session il y a ...
Je dois mettre la variable $succes_membre avant ou après l'erreur_membre ?
Le mail part bien, avec les bonnes informations...je me documenterai pour mieux comprendre les headers et tout le bazar, car le "from" ne contient que mon adresse email paramétrée dans php.ini et non From ma pomme... :D
Merci! :oops:

Eléphant du PHP | 254 Messages

17 mars 2006, 14:10

de digérer le ba-ba des structures conditionnelles :oops:
J'ai refait ma page comme cela :
Mais ça coince, si erreur, les données du formulaires ne sont pas conservées, et le futur membre doit tout retaper :-s
<?php require_once('includes/xxxx.php'); ?>
<?php
//init des variables
if(!isset ($_POST['id'])) $id=""; else $id=htmlentities(addslashes($_POST['id']));
if(!isset ($_POST['nom'])) $nom=""; else $nom=htmlentities(addslashes($_POST['nom']));
if(!isset ($_POST['prenom'])) $prenom=""; else $prenom=htmlentities(addslashes($_POST['prenom']));
if(!isset ($_POST['login'])) $login=""; else $login=htmlentities(addslashes($_POST['login']));
if(!isset ($_POST['pass'])) $pass=""; else $pass=htmlentities($_POST['pass']);
if(!isset ($_POST['pass2'])) $pass2=""; else $pass2=htmlentities($_POST['pass2']);
if(!isset ($_POST['adresse'])) $adresse=""; else $adresse=htmlentities(addslashes($_POST['adresse']));
if(!isset ($_POST['code_postal'])) $code_postal=""; else $code_postal=htmlentities(addslashes($_POST['code_postal']));
if(!isset ($_POST['ville'])) $ville=""; else $ville=htmlentities(addslashes($_POST['ville']));
if(!isset ($_POST['email'])) $email=""; else $email=htmlentities(addslashes($_POST['email']));
if(!isset ($_POST['tel'])) $tel=""; else $tel=htmlentities(addslashes($_POST['tel']));
if(!isset ($_POST['naissance'])) $naissance=""; else $naissance=htmlentities(addslashes($_POST['naissance']));
if(!isset ($_POST['ajoutMembre'])) $ajoutMembre="non"; else $ajoutMembre=$_POST['ajoutMembre'];
if(!isset($erreur_Membre)) $erreur_Membre=0; 
if(!isset($_POST['ajoutMembre'])) $ajoutMembre=""; else $ajoutMembre=$_POST['ajoutMembre'];
if ($ajoutMembre=="ok")
{    //sélection de la base de données 
    mysql_select_db($database, $connexion); 
    //vérification si le mail existe déjà dans la base 
    $query_Membre = "SELECT email FROM membres WHERE email = '$email' "; 
    $Membre = mysql_query($query_Membre, $connexion) or die(mysql_error()); 
    $totalRows_Membre = mysql_num_rows($Membre); 
    //si mots de passe identiques
    if ($pass==$pass2)
       {
        if ($totalRows_Membre==0)//si le mail n'existe pas encore alors : 
        { //enregistrement dans la base du nouveau compte client 
            mysql_select_db($database, $connexion); 
            $insertMembre = "INSERT INTO membres (nom, prenom, login, pass, pass2, adresse, code_postal, ville, email, naissance) VALUES ('$nom', '$prenom', '$login', '$pass', '$pass2', '$adresse', '$code_postal', '$ville', '$email', '$naissance')"; 
            mysql_query($insertMembre, $connexion) or die(mysql_error()); 
            $adresse = $email; 
            $titre = "Confirmation d'inscription"; 
            $headers="From : ma pomme \n"; 
            $message = "Bienvenue sur notre site ! 

Nous vous confirmons votre inscription sur le site : 
Merci de bien conserver ce mail,\n il contient vos identifiants et mot de passe pour accéder à votre espace personnel :\n 

Votre login est : ".$login." \n 
Votre pass est : ".$pass2." \n 

Pour vous connecter sur le site et acceder a votre profil vous devez d'abord cliquer sur le lien suivant : 
http://www........"; 

                mail($adresse,$titre,$message,$headers); 
                }else{ 
    	//si l'email existe déjà > message d'erreur
	$erreur_Membre=1;
	}
            }else{
            header("Location: inscription.php?erreur=true"); 
            }
       }else{
       header("Location : inscription.php?success=true");
}?>
Et l'appel plus bas :
<?php
if (isSet($_GET['erreur']) && $_GET['erreur'])
{ //affichage du message d'erreur mots de passe
?>
<span class="Style15">Mot de passes non similaires, veuillez recommencer</span>
<?php
}
?>
<?php if(isSet($_GET['succes']) && $_GET['succes']) 
{ //affichage du message d'inscription réussie
?>
<span class="Style15">Votre inscription a été prise en compte !<br />
Vous allez recevoir un mail contenant vos logins et mot de passe. </span><span class="Style4"><strong>Pour acc&eacute;der &agrave; votre compte, veuillez <a href="index.php">vous identifier</a></strong></span> <?php echo $prenom; echo $nom; ?>
<?php
}
?>
<?php // script d'affichage d'erreur email existant dans la base
if ($erreur_Membre==1)
{
?>
<span class="Style4 Style13">Ce mail<strong> <?php echo $email; ?> </strong>existe d&eacute;j&agrave; dans notre base membres. <strong><br />
</strong>Choississez un autre mail et réinscrivez vous.</span><br /><br />
<?php
$erreur_Membre=0; // raz du drapeau d'erreur
}
?>
Les erreurs mots de passes différents s'affichent bien maintenant, mais lorsque le message s'affiche, je perds les données du formulaire rempli....alors qu'avant de faire la vérif mot de passe, ça fonctionnait :cry: une idée ?
merci !

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

17 mars 2006, 15:32

Je vois que tu as bien avancé sur tes mails dis donc :)

Pour les données de ton formulaire qui ne sont plus présentes en cas d'erreur, c'est le même problème que précédement, puisque tu passes par un header, c'est comme si tu rechargeais la page sans renvoyer les données, du coup il n'y a plus rien dans ton $_POST.

Comme ton formulaire est en dessous, je pense que tu peux les supprimer (les headers), et laisser l'exécution se poursuivre en jouant des flags

A priori, l'avertissement que tu avais (Notice: Use of undefined constant succes_Membre - assumed 'succes_Membre' in d:\programmes\easyphp1-8\www\xxxx\inscription.php on line 162) dit que tu essayes de faire appel à succes_Membre comme s'il s'agissait d'une constante... n'aurais tu pas juste oublié de mettre un $ devant succes_Membre à la ligne 162 ? :)

Eléphant du PHP | 254 Messages

17 mars 2006, 15:38

hehe j'avance seule et je me réponds à moi-même mais j'avance !
Non, je n'avais pas oublié, mais je n'avais pas appelé la condition :lol:
J'ai un souci avec les flags, j'pige pas trop en fait...c'est pour ça que je mets des headers....je préfèrerais effectivement les utiliser, comme j'avais fait pour le mail identique..mais je n'arrive pas à l'appliquer pour plusieurs.
Ceci dit !!! MERCI MERCI, grâce à toi je progresse, merci de suivre mon "cas" :oops: :oops:

bon...j'ai deux drapeaux, m'en manque un !!! 8) :lol:
				}else{ 
        		//si l'email existe déjà > message d'erreur 
    			$erreur_Membre=1; 
   				 } 
            }else{ 
            header("Location : inscription.php?erreur=true");
            } 
       }else{ 
       $ajoutMembre=="ok"; 
}?> 
donc nickel pour le message de félicitations....les données sont conservées. Chouette.
Comment je pourrais faire pour la vérif des mots de passe ?
Car après ça se corsera....je ferais les vérifs des champs obligatoires, plutôt que de mettre des fenetres d'alertes Javascript, j'ai horreur de ça :evil:

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

17 mars 2006, 16:01

Arch ya... on fa s'occuper dé fotre cas... allonchez fous sur ce divan et racontez moi tout ! ;)

Pour les flags, ça n'a rien de sorcier. Considère ça comme des drapeaux (quelle connaissance de l'anglais hein ?! ;)) que tu vas lever quand tu as besoin d'un repère. C'est comme sur ces boites aux lettres, où tant que le drapeau n'est pas levé, c'est qu'il n'y a pas de courrier, donc pas besoin de sortir dans le froid de son jardin pour rien :))

Ben là, c'est pareil (à ceci près que tu n'as pas à traverser le jardin.. ;))
$succes = false; // par habitude, il vaut mieux déclarer les variables qui n'ont pas une portée locale avant le reste du code.
// ça permet aussi de pouvoir donner une valeur initiale. Ici je considère que par défaut mon succès est à faux, j'aurais donc juste besoin de le mettre à vrai en cas de succès.
// en php, ce n'est pas gênant, mais dans certains langages, si tu déclares une variable dans un if, elle n'est accessible qu'à l'intérieur du if (entre les acolades { })
// donc c'est une bonne habitude à prendre, mais tu fais comme tu veux vu que pour l'instant je ne crois pas que cela gene en php..
// mais revenons en à nos moutons... :)

if( .... ) { // tout plein de conditions
  // tout plein de traitements 

  if(...) // si tout à fonctionné, c'est la fête
    $succes = true;
  else // comme $succes à été initialisé à faux le else ne sert pas vraiment ici
    $succes = false;
}

//...

if($succes)
  echo "Si vous lisez ceci, c'est que vous avez bien compris les flags ;)";
else
  echo "bon.. c'est pas grafe.. on fa plannifier de suite la prochaine séance ya !";
Edit : (si je lisais tout le message avant de répondre, ca serait mieux nan ?)

Pour les différents type d'erreur, tu peux au lieu d'utiliser un booléen, te servir de codes... si le login existe déjà, tu mets ton flag à 1, si le mot de passe n'est pas bon, tu met ton flag à 2 etc. Et des le moment ou le flag est différent de zéro tu considères qu'il y a une erreur et tu affiches le message approprié.

Bon... c'est une solution... le mieux serait je pense de signaler qu'il y a une erreur par un message ("Qu'est ce que t'as fichu ?! la moitié des champs ne sont pas bon, file me corriger ça tout de suite !!") et ensuite à côté de chaque champ, faire un test par variable qui te permettrait d'afficher une info pour indiquer le champ concerné :
<input name="password" value="<?=$_POST['password']?>"> <? if (isSet($_POST['password']) && empty($_POST['password'])) echo "Ce champ est obligatoire"; ?>
Modifié en dernier par Ryle le 17 mars 2006, 16:08, modifié 1 fois.

Eléphant du PHP | 254 Messages

17 mars 2006, 16:05

:cry: si je saisis un mail déjà existant dans la base !
J'ai le message "mail existant" qui s'affiche, mais aussi : Bravo vous êtes enregistrés !!
:x :x :x :x

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

17 mars 2006, 16:12

Ca c'est parce que tu as mis ton flag succes à vrai alors que le mail était pas bon :p

Tu peux aussi regrouper tes deux flags en un seul... s'il y a des erreurs, il y a peu de chance que le flag succes soit à vrai ;)

J'ai édité mon précédent post vu que j'avais loupé une partie de ton message, tu aurais peut être quelques pistes dedans :)