Formulaire d'inscription affichage erreurs ou confirmation

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Formulaire d'inscription affichage erreurs ou confirmation

pour ?

par coxine » 18 mars 2006, 18:29

le décryptage ?
J'ai lu un post d'un modérateur hier, qui disait : oui effectivement c'est mieux de crypter, mais on part du principe que si un hacker arrive à rentrer dans base, alors, il peut aussi arriver à trouver la commande de décryptage. Le plus embetant, est que l'administrateur a accès aux mots de passe de ses abonnés, et que ces derniers emploient souvent le meme pour tout.
Mais merci, j'y songerais !

par Laap » 18 mars 2006, 18:14

Tu rajoute ces lignes a ton script :

Code : Tout sélectionner

$creehash="abcCDEefghHIJklmnNOPqrstTUVwxyYZ23456789"; srand((double)microtime()*1000000); for($i=0; $i<9; $i++){ $chaine .= $creehash[rand()%strlen($creehash)]; } $passe=MD5($chaine);

la logique

par coxine » 18 mars 2006, 14:03

que tu m'as fait comprendre, oh maitre du PHP !!! :wink: :agenouille:
Je me rends compte, plus je "pratique" ce langage, plus il est important de tout mettre sur papier avant....
bon, je vais regarder les fonctions mail(), car j'ai besoin de personnaliser l'adresse qui envoiele mail.
Mettre : Webmaster, au lieu de [email protected]
;-)
Cette histoire de "headers", et voir aussi, pour pousser la perfection, comment on pourrait envoyer du html au lieu du texte, car il n'est pas très "sexy" mon mail de bienvenue.
Ah, question sécurité : c'est suffisant les htmlentities et addslashes? Je n'ai pas mis md5, car je ne veux pas que le mot de passe soit crypté....il faudrait que je développe un truc qui permette de renvoyer un mot de passe temporaire, et ensuite le type le modifierai...mais le mot de passe temporaire, ça je ne sais pas faire :lol:

par Ryle » 18 mars 2006, 13:55

Impressionant en effet, on croirait presque à de la télépathie pour arriver aux mêmes conclusions en même temps :)
(ou alors juste à de la logique ? ;))

Corrigé

par coxine » 18 mars 2006, 13:48

J'ai refléchis sur l'ordre des conditions
Il est plus logique de vérifier si le formulaire est vide d'entrée...
Alors :
conditions
1. Si tu cliques sur OK
2. si champs non vides
3. si pass==pass2
4. si mail inexistant dans la base
Alors......
Message de félicitations
Vérifications :
4. mail existe déjà
3. pass!=pass2
2. champs obligatoires non remplis
1. merci de remplir le formulaire
....
Je vais tester à fond et je te dirais quoi !
:)

Edit Par moi-même : 12:48ahah

trop fort, on poste quasi en meme temps

par Ryle » 18 mars 2006, 13:46

Le dernier else que tu as mis correspond donc à "si tu n'as pas cliqué sur ajouter. Cela revient donc à l'arrivée sur la page avant d'avoir rempli le formulaire :)
Tu peux donc te passer du else qui n'apporte rien de plus (où tu peux toujours l'utiliser en te disant que cela correspond au premier accès sur la page, là c'est toi qui voit :))

Sinon tous tes controles sont bons, mais effectivement leur ordre serait à revoir. Il faut essayer d'aller du plus grand au plus petit (ou au plus compliqué). Si tous les champs ne sont pas rempli, on va pas plus loin, inutile de comparer les mot de passe ou de chercher un mail en base. Si les mots de passe sont différents, inutile de se connecter à la base pour aller chercher le mail, etc. :)

Il te suffit donc d'intervertir le 2 et le 3 :

1. si tu cliques sur ajouter
2. si TOUS les champs obligatoires sont remplis
3. si le pass1 == pass2
4. si le mail n'existe pas dans la base alors....

() enregistrement du nouveau membre
J'envoie le mail et ensuite
$success = true "Félicitations"

4. else $success = false "mail existe dans la base"
3. else $success = false "les mots de passe sont différents"
2. else $success = false "merci de remplir TOUS les champsobligatoires"
1. pas de else, vu que pas de "sinon" à gérer :)

hello

par coxine » 18 mars 2006, 13:37

oui je viens de rééditer ma page...
J'ai choisi que tous les champs soient remplis (car je n'exigeais pas cela avant, je m'étais trompée :oops:
d'où :
if (($nom!="")&&($prenom!="")&&($login!="")&&($pass!="")&&($pass2!="")&&($email!="")&&($tel!="")){
Donc la variable $success = true doit être à la fin, non ?
Puisque c'est ce que je cherche en premier par le :
donc je reprends :
1. si tu cliques sur ajouter
2. si le pass1 == pass2
3. si TOUS les champs obligatoires sont remplis
4. si le mail n'existe pas dans la base alors....

() enregistrement du nouveau membre
J'envoie le mail et ensuite
$success = true "Félicitations"

4. else $success = false "mail existe dans la base"
3. else $success = false "merci de remplir TOUS les champsobligatoires"
2. else $success = false "les mots de passe sont différents"
1. :-k c'est là que ça ne va pas ! Si je clique de suite sur ajouter...il faut que j'indique : "merci de remplir les champs" non ?
Le dernier else...que j'ai mis correspond à quoi ?

:?
}else{  
$success = false; 
$message = ""; 
} 
Pigé!!! : Edit 12:41
Le dernier else, c'est quand on arrive sur la page la première fois...donc je ne mets rien, ou un message explicatif :lol:

par Ryle » 18 mars 2006, 13:24

Alors, pour essayer de répondre dans l'ordre...

Effectievment, les if/else s'imbriquent les uns dans les autres (chaque else correpondant au if qui le précede immédiatement (l'indentation te permettant donc de voir quel else correspond à quel if, puisqu'ils sont sur la même colonne :))
Tu as donc bien 1234 4321

Pour ta condition OU ou ET, tout dépend de ce que tu veux faire, mais je pense que dans tous les cas, le soucis est sur le "==". En effet, là tu rentre dans ton if si les champs sont vides, alors que dans ce cas, tu devrais aller dans le else :) Si tu les remplace par des "!=" (différent) alors tu ne rentreras dans le if que si tous les champs sont remplis.

Ensuite, pour le ET ou OU, ca dépend de ce que tu veux faire. Avec ET il faut que tous les champs soient remplis pour passer à la suite. Avec OU, il suffit qu'au moins un des champs soit rempli (mais ce n'est donc pas ce que tu recherches :))

Tu pourrais éventuellement l'utiliser si tu le souhaites, en inversant ta condition et tes signes. Tu testerais alors bien si au moins l'un des champs est égal à vide, alors erreur (dans le if), sinon succes (dans le else)
En effet, le contraire de la condition "a OU b" c'est "!a ET !b" ( ! signifiant le NON, soit ni a et ni b :))

je recopie-colle l'ensemble de mon code....ça

par coxine » 18 mars 2006, 12:54

bloque au niveau des tests....:-(
EX. : je remplis TOUS les champs, je fais exprès de mettre un mot de passe1 != pass2, puis je rentre un email existant dans la base....
Retour erreurs :
1. mots de passe différents, veuillez.... (je corrige et je refais submit)
2. Merci de remplir les champs oblgatoires.. (ils sont tous remplis !)
Et là ça bloque....:-s
<?php require_once('includes/connexion.php'); ?>
<?php
//init des variables
$success = false;
$message = "";
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 (($nom!="")&&($prenom!="")&&($login!="")&&($pass!="")&&($pass2!="")&&($email!="")&&($tel!="")){
			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, tel, naissance) 
				VALUES ('$nom', '$prenom', '$login', '$pass', '$pass2', '$adresse', '$code_postal', '$ville', '$email', '$tel', '$naissance')";
				mysql_query($insertMembre, $connexion) or die(mysql_error()); 
				$adresse = $email; 
				$titre = "Confirmation d'inscription"; 
				$headers="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://localhost......php"; 
				
				mail($adresse,$titre,$message,$headers); 
				$success = true ;
				$message = "Félicitations $prenom $nom, votre inscription a été prise en compte,<br/> 
				vous allez recevoir un email reprenant vos mots de passe et login d'accès au site.<br />
				Pour accéder à votre espace membre, veuillez vous identifier <a href='index.php'>ici</a>";
			}else{ 
			//si l'email existe déjà > message d'erreur 
			$success = false; 
			$message = "Cet email <b>$email</b> existe déjà dans notre base";
        	} 
		}else{
		// si champs obligatoires non remplis
		$success = false;
		$message = "<-- Merci de remplir les champs obligatoires -->";
		}
	}else{ // mots de passes différents 
	$success = false; 
	$message = "<- mot de passe différent,<br /> veuillez vérifier à nouveau votre saisie"; 
    } 
}else{  
$success = false; 
$message = ""; 
} 
?>
donc, l'ordre est important, ça je pige..mais lequel ?
1234 et 4321 ou bien
1234 et 1234 ?

oui merci Ryle !

par coxine » 18 mars 2006, 12:43

hum, à la tienne :boire9: vue l'heure tardive à laquelle tu m'as répondu !!
J'y ai pensé hier soir tardivement aussi.
Que les messages ne devaient pas être dans le bon sens...
SI j'ai bien compris :
condition1
         condition2
                 condition3
 ../..
                 else3
         else2
else1
C'est ça ?
Et puis, dans mon test de champs vides, j'ai mis OR au lieu de ET, il serait préférable de tout passer à :
if (($nom=="")&&($prenom=="")&&($login=="")&&($pass=="")&&($pass2=="")&&($email=="")&&($tel=="")){
au lieu de :
if (($nom=="")||($prenom=="")||($login=="")||($pass=="")||($pass2=="")||($email=="")||($tel=="")){
Non ?
en fait, j'ai bouquiné entre hier et ce matin 8) ...mainan que j'ai pigé le truc, tout me semble plus clair ;-) D'ailleurs, dans mon cas, un switch ....case ne serait-il pas plus approprié ?

par Ryle » 18 mars 2006, 01:07

42 ! (ben quoi ? c'est un id comme un autre nan ? ;))

Tout est bon, mais tu as inversé tes messages... si tu avais scrupuleusement indenté ton code (si, si, l'indentation c'est sacré :)), tu aurais tout de suite vu que tes if n'étaient pas alignés avec les bons else ;p
if (($nom=="")||($prenom=="")||($login=="")||($pass=="")||($pass2=="")||($email=="")||($tel=="")) { 
	if ($totalRows_rsMembre==0) { //si le mail n'existe pas encore alors : 
		//enregistrement dans la base du nouveau compte client 
		mysql_select_db($database //etc.... 

		//suite du code 
		mail($adresse,$titre,$message,$headers); 
		$success = true ; 
		$message = "Félicitations $prenom $nom, votre inscription a été prise en compte,<br/> vous allez recevoir un email reprenant vos mots de passe et login d'accès au site. Pour accéder à votre espace membre, veuillez vous identifier <a href='index.php'>ici</a>"; 
	}
	else{ 
		// si champs obligatoires non remplis 
		$success = false; 
		$message = "<-- Merci de remplir les champs obligatoires -->"; 
	} 
}
else{ 
	//si l'email existe déjà > message d'erreur 
	$success = false; 
	$message = "Cet email <b>$email</b> existe déjà dans notre base"; 
} 
Bon aller, on mettra ça sur le compte de l'heure tardive d'un vendredi soir de fête de Saint Patrick - hips! - ;)

yep ok je me souviendrais !

par coxine » 17 mars 2006, 23:26

hehe
Je n'ai pas terminé mon précédent post,
en fait, j'ai oté TOUT le javascript et le formulaire ne part pas tant que les champs obligatoires et/ou mal renseignés ne sont pas remplis.
et ce, grâce à :
//init des variables....
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 (($nom=="")||($prenom=="")||($login=="")||($pass=="")||($pass2=="")||($email=="")||($tel==""))
                   {
	    if ($totalRows_rsMembre==0)//si le mail n'existe pas encore alors : 
	        { //enregistrement dans la base du nouveau compte client
                         mysql_select_db($database //etc....

//suite du code
mail($adresse,$titre,$message,$headers); 
$success = true ;
$message = "Félicitations $prenom $nom, votre inscription a été prise en compte,<br/> vous allez recevoir un email reprenant vos mots de passe et login d'accès au site. Pour accéder à votre espace membre, veuillez vous identifier <a href='index.php'>ici</a>";
	     }else{
	     // si champs obligatoires non remplis
	     $success = false;
	     $message = "<-- Merci de remplir les champs obligatoires -->";
	     }
             }else{ 
              //si l'email existe déjà > message d'erreur 
              $success = false; 
              $message = "Cet email <b>$email</b> existe déjà dans notre base";
              } 
        }else{ // mots de passes différents 
        $success = false; 
        $message = "<- mot de passe différent,<br /> veuillez vérifier à nouveau votre saisie"; 
    } 
}else{  
    $success = false; 
    $message = ""; 
} 
?>
Et dans le formulaire :
 <?php if($success) 
    echo "<span class=Style13>$message</span>"; // Bravo 
else 
    echo "<span class=Style15>$message</span>"; // Boouuuhh !! 

// ... 
?> 
// ...formulaire : exemple
<td><div align="left">
      <input name="nom" type="text" class="form" id="nom" value="<?php echo $nom; ?>" /></div>
</td>
<td><div align="left"><? if (isset($_POST['nom']) && empty($_POST['nom'])) echo "<- Ce champ est obligatoire"; ?></div>
</td>
Pas mal non ? ;-) j'imagine que ce n'est pas propre du tout, mais on y arrivera !
allez....dodo :sleeping:
Heuuuu je viens de faire un test, si après le message d'erreur des mots de passe différents, je rentre un mail qui n'est pas dans la base, il m'affiche, ce mail existe déjà dans la base.
Hummmmmmmmmmm ](*,) ](*,) :tir2:
Je regarderais tout ça demain, mais si tu as une ID, ce serait merveilleux !!!
Bye A+

par Ryle » 17 mars 2006, 20:39

Y a pas de soucis :) pis si tu as besoin d'aide, tu cri ;)

Pour l'envoi du formulaire, tu as deux solutions :
- tu peux utiliser un bouton (input) de type submit qui va envoyer immédiatement le formulaire. Si jamais tu as besoin de faire des contrôle javascript sur les champs ou tout autre action au moment de la soumission, il faut que tu ajoute l'attribut onSubmit="" dans la balise <form>
- l'autre solution consiste à utiliser un input de type button et définir l'attribut onclick="" de manière à ce qu'il fasse ton traitement puis soumette le formulaire en javascript (document.leFormulaire.submit()).

Personnellement j'ai opté pour cette seconde solution qui me permet de faire un contrôle javascript (avec un message d'alerte :p) avant d'envoyer le formulaire et éviter un appel au serveur alors qu'il y a des erreurs :) (ce qui ne m'empêche pas derriere de recontroler les valeurs en php ;))

hum

par coxine » 17 mars 2006, 18:14

Merci ryle : hehe tu vas me recroiser, c'est certain. Mais regarde, je crois que j'ai pigé
bon, en fait
Je m'aperçois qu'une fois la fonction onSubmit Javascript enlevée, le formulaire part, malgré les vérifs d'erreurs.
Ca doit venir de mon init des variables ?
J'ai ça rajouté une quatrième condition
if (($nom=="")||($prenom=="")||($login=="")||($pass=="")||($pass2=="")||($email=="")||($tel==""))
		{
et ça a l'air de tourner ;-)

par Ryle » 17 mars 2006, 18:03

lol, arrête ou mes chevilles vont vraiment ressembler à celle de l'éléphant :) (en moins bleu peut être... ;))

Bon courage pour la suite :)