Système d'inscription made in moi.

Mammouth du PHP | 991 Messages

29 mars 2009, 16:32

Englobe ton switch avec
if (isset($_POST) and !empty($_POST))

donc , le script en rentrera dans le switch que s'il y a des données en POST , donc forcement que si tu as envoyé ton formulaire
DevOps, Symfony4, Hoa

Eléphant du PHP | 75 Messages

29 mars 2009, 18:02

Merci, ça marche bien. :)

Mais, il y a toujours un mais, Quand je regarde dans ma table, il y a l'id de l'utilisateur, la date et l'heure d'inscription, mais je ne vois ni son mdp, ni son pseudo, ni son email... :/ Et la vérif ne se fait pas...

Une idée ?

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

29 mars 2009, 23:23

Quelques remarques....

- Concernant ton problème de vérif, c'est encore une erreur d'innatention (donne tes doigts ! :twisted: ) : tu fais un count(*) pour savoir si l'enregistrement existe en base, tu récupères le résultat dans une variable "$tab" et tu testes un hypothétique résultat contenu dans une variable "$resultat" sortie d'on ne sait où :)

- il ne sert à rien de protéger tes variables ($Pseudo = mysql_real_escape_string($Pseudonyme)) si au moment de les utiliser dans ta requête tu fais appel à la variable non protégée ($Pseudonyme)

- la fonction empty() teste non seulement si la variable est "vide" (0, false, "", ...) mais également l'existance de la variable. Faire un isSet() supplémentaire est donc redondant :) Et c'est d'ailleurs pas le switch qu'il faut englober avec ce test, mais la partie où tu récupères les données transmises en $_POST

- A moins de savoir très précisément quelle est la différence entre l'opérateur "&&" et l'opérateur "AND" en php et les impacts que peut avoir le second sur ton code, je te recommande de toujours utiliser le premier (&&) (cf. le code proposé par thehawk, et c'est vallable pour lui aussi ;)).

- Tu n'as pas besoin de passer ta variable $erreur en paramètre de ta fonction verif() si tu ne l'utilises pas :)

- la fonction mysql_fetch_assoc() retourne un tableau, pas un booléen. Le test ($tab === true) ne pourra donc jamais être vrai, puisque $tab contiendra soit un array soit FALSE en cas d'erreur :)


Bon ben voilà, je crois que j'ai fait le tour... n'hésites pas si tu as des questions quant à mes commentaires :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 75 Messages

30 mars 2009, 19:08

Merci pour ta réponse Ryle. ;)

Pour info, toute la partie MySQL toussa, j'ai prit ça du tuto de AB. ;)

Bon, si j'ai bien compris. :)

Code : Tout sélectionner

- Concernant ton problème de vérif, c'est encore une erreur d'innatention (donne tes doigts ! ) : tu fais un count(*) pour savoir si l'enregistrement existe en base, tu récupères le résultat dans une variable "$tab" et tu testes un hypothétique résultat contenu dans une variable "$resultat" sortie d'on ne sait où
D'accord, mais je fais quoi alors ? :D
- il ne sert à rien de protéger tes variables ($Pseudo = mysql_real_escape_string($Pseudonyme)) si au moment de les utiliser dans ta requête tu fais appel à la variable non protégée ($Pseudonyme)
Donc je supprime la ligne d'accord ?
- la fonction empty() teste non seulement si la variable est "vide" (0, false, "", ...) mais également l'existance de la variable. Faire un isSet() supplémentaire est donc redondant Et c'est d'ailleurs pas le switch qu'il faut englober avec ce test, mais la partie où tu récupères les données transmises en $_POST
J'englobe le test ici alors ? :
$Pseudo         	= $_POST['pseudo'];
$mdp 			    = $_POST['mdp'];
$confirmation_mdp   = $_POST['confirmation_mdp'];
$email              = $_POST['email'];
$confirmation_Email = $_POST['confirmation_email'];
$erreur             = null;
- A moins de savoir très précisément quelle est la différence entre l'opérateur "&&" et l'opérateur "AND" en php et les impacts que peut avoir le second sur ton code, je te recommande de toujours utiliser le premier (&&) (cf. le code proposé par thehawk, et c'est vallable pour lui aussi ).
C'est chose faite. ;)
- Tu n'as pas besoin de passer ta variable $erreur en paramètre de ta fonction verif() si tu ne l'utilises pas


Alors je supprime toutes les $erreur, n'est ce pas ? :)
function verif($pseudo,$mdp,$confirmation_mdp,$email,$confirmation_email,$erreur){
	if(!empty($pseudo) && !empty($mdp) && !empty($confirmation_mdp) && !empty($email) && !empty($confirmation_email)){
		if(($mdp == $confirmation_mdp) && ($email == $confirmation_email)){
			if(preg_match("#[a-z0-9]{2,30}@[a-z0-9]{2,30}.[a-z]{0,10}#",$email)){
				$erreur = 0;
				return $erreur;
			}
			$erreur = 1;
			return $erreur;
		}
		$erreur = 2;
		return $erreur;
	}
	$erreur = 3;
	return $erreur;
}
- la fonction mysql_fetch_assoc() retourne un tableau, pas un booléen. Le test ($tab === true) ne pourra donc jamais être vrai, puisque $tab contiendra soit un array soit FALSE en cas d'erreur
Donc je supprime cette ligne ? :D
	$tab = mysql_fetch_assoc($exe);

______

Désolé de vous embêter avec toutes mes questions, mais je gère de projet en même temps et bientôt un 3eme et ça commence à faire "Plouf!" dans ma tête... :D

Sinon, pour le hashage en sha tu sais pas ? :D

Merci again. :D

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

30 mars 2009, 21:24

Code : Tout sélectionner

- Concernant ton problème de vérif, c'est encore une erreur d'innatention (donne tes doigts ! ) : tu fais un count(*) pour savoir si l'enregistrement existe en base, tu récupères le résultat dans une variable "$tab" et tu testes un hypothétique résultat contenu dans une variable "$resultat" sortie d'on ne sait où
D'accord, mais je fais quoi alors ? :D
Bah tu utilises la variable dans laquelle tu as stocké ton résultat :P
   $exe = mysql_query($requete); 
   $tab = mysql_fetch_assoc($exe); 
   ^__
         v
   if ($tab['nb'] == 0) //  et pas ($resultat['nb'] == 0) 


- il ne sert à rien de protéger tes variables ($Pseudo = mysql_real_escape_string($Pseudonyme)) si au moment de les utiliser dans ta requête tu fais appel à la variable non protégée ($Pseudonyme)
Donc je supprime la ligne d'accord ?
Aaah bah non... c'est une bonne chose de protéger ses variables pour l'insertion SQL! Faut juste qu'ensuite, dans ta requête SQL tu te serves de la variable $Pseudo qui est protégée et pas de $Pseudonyme qui ne l'est pas :)
    $Pseudo = mysql_real_escape_string($Pseudonyme); 
    $Pass = mysql_real_escape_string($Mdp); 
    ....
    $insertion = "INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('".$Pseudo."', '".$Pass."', NOW())";  
    // au lieu de : ('".$Pseudonyme."', '".$Mdp."', NOW())"; 
Et tu peux effectivement utiliser les fonctions sha ou md5 pour crypter le mot de passe au moment où tu l'insères :)
- la fonction empty() teste non seulement si la variable est "vide" (0, false, "", ...) mais également l'existance de la variable. Faire un isSet() supplémentaire est donc redondant Et c'est d'ailleurs pas le switch qu'il faut englober avec ce test, mais la partie où tu récupères les données transmises en $_POST
J'englobe le test ici alors ? :
$Pseudo         	= $_POST['pseudo'];
$mdp 			    = $_POST['mdp'];
$confirmation_mdp   = $_POST['confirmation_mdp'];
$email              = $_POST['email'];
$confirmation_Email = $_POST['confirmation_email'];
$erreur             = null;
Ouaip ! :)

- Tu n'as pas besoin de passer ta variable $erreur en paramètre de ta fonction verif() si tu ne l'utilises pas

Alors je supprime toutes les $erreur, n'est ce pas ? :)
Pas forcément toutes, mais tu peux virer celle en argument de la fonction (dans la déclaration et dans l'appel). Et tu peux aussi retourner une valeur sans la stocker dans une variable :
function verif($pseudo,$mdp,$confirmation_mdp,$email,$confirmation_email){
	if(!empty($pseudo) && !empty($mdp) && !empty($confirmation_mdp) && !empty($email) && !empty($confirmation_email)){
		if(($mdp == $confirmation_mdp) && ($email == $confirmation_email)){
			if(preg_match("#[a-z0-9]{2,30}@[a-z0-9]{2,30}.[a-z]{0,10}#",$email)){
				return 0;
			}
			return 1;
		}
		return 2;
	}
	return 3;
}
Par contre, je te recommande de commenter ton code ou d'utiliser des constantes pour ne pas avoir à chercher à quoi correspondent les 0, 1, 2 ou 3 ;)
- la fonction mysql_fetch_assoc() retourne un tableau, pas un booléen. Le test ($tab === true) ne pourra donc jamais être vrai, puisque $tab contiendra soit un array soit FALSE en cas d'erreur
Donc je supprime cette ligne ? :D
	$tab = mysql_fetch_assoc($exe);
Raah mais c'est fini de vouloir tout supprimer ?? :)

Le problème vient du test pour savoir quand tu dois ajouter ta valeur en session. Si ton test est toujours faux, jamais tu verras le pseudo en session. Il te faut soit modifier ton test ($tab === true) pour qu'il ait une chance d'être vrai, soit le retirer, vu que dès le moment où tu as inséré ton utilisateur, tu dois pouvoir le mettre en session (et là tu peux utiliser $Pseudonyme, puisque tu n'as pas besoin de la valeur protégée pour la base de données)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 75 Messages

30 mars 2009, 21:54

Merci :D Ca avance bien.

Cependant ...

J'ai tout le temps droit à ça : Erreur : Champs vides.

J'ai toujours ce problème de rien de visible en MySQL... :/ Et je peux toujours m'inscrire sans rentrer de champ.

Bon je vais vous faciliter la tâche :
<?php
if (isset($_POST) && !empty($_POST)) {
	
$Pseudo         	= $_POST['pseudo'];
$mdp 			    = $_POST['mdp'];
$confirmation_mdp   = $_POST['confirmation_mdp'];
$email              = $_POST['email'];
$confirmation_Email = $_POST['confirmation_email'];
$erreur             = null;
 
}
function erreur($erreur){
	echo("Erreur : ".$erreur."");
}
 
function verif($pseudo,$mdp,$confirmation_mdp,$email,$confirmation_email){ 
    if(!empty($pseudo) && !empty($mdp) && !empty($confirmation_mdp) && !empty($email) && !empty($confirmation_email)){ 
        if(($mdp == $confirmation_mdp) && ($email == $confirmation_email)){ 
            if(preg_match("#[a-z0-9]{2,30}@[a-z0-9]{2,30}.[a-z]{0,10}#",$email)){ 
                return 0; 
            } 
            return 1; 
        } 
        return 2; 
    } 
    return 3; 
} 

	switch ($erreur = verif($pseudo,$mdp,$confirmation_mdp,$email,$confirmation_email,$erreur)){ 
		case 1:
			erreur("Mail");
			break;
		case 2:
			erreur("Vous n'avez pas entrer deux mot de passe identique, ou, deux adresses emails identiques.");
			break;
		case 3:
			erreur("Champs vides.");
			break;
		default:
			echo "Erreur General";	
	}
    $mysql_connexion = mysql_connect("", "", ""); 
    mysql_select_db ('Membres', $Membres);  
 
	$Pass = mysql_real_escape_string($mdp);
	$Pseudo = mysql_real_escape_string($Pseudo);
 
	$requete = "SELECT count(*) as nb FROM Membres Where Pseudonyme = '".$nom."'";
$exe = mysql_query($requete);  
   $tab = mysql_fetch_assoc($exe);  
   if ($tab['nb'] == 0) //  et pas ($resultat['nb'] == 0) 
	{
    	$insertion = "INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('".$Pseudo."', '".$Pass."', NOW())"; 
		$inser_exec = mysql_query($insertion);
 
		if ($$Pseudonyme === true)
			{
			session_start();
			$_SESSION['pseudo'] = $pseudo;
			}
	}
 
	else 
	{ 
	$message = 'Ce pseudonyme est déjà  utilisé. Merci de le modifier.';
	}
 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" media="screen" type="text/css" title="Design" href="design.css" />
<title>J.Newb - </title>
</head>
 
<body>
<div id="baniere">
</div>
 
<div id="contenu">
	<form method="POST">
    <p class="petitvertgras">L'inscription sur J.Newb est gratuite et ne prend que très peu de temps. Une fois le formulaire rempli, vous recevrez un e-mail contenant vos identifiants et un lien afin d'activer votre compte. </p><br />
 
    <p class="normalgris"><strong>Formulaire d'inscription : </strong>
    </p><br/>
    <span class="petitvert">Pseudonyme : </span>
    <div id="champs"><input name="Pseudonyme" type="text"/></div><br />
    <span class="petitvert">Mot de Passe : </span>
    <div id="champs"><input type="password" name="Mdp"  /></div><br />
    <span class="petitvert">Confirmation du mot de passe :</span><br />
    <div id="champs"><input type="password" name="Confirmation_mdp" /></div><br />
    <span class="petitvert">Adresse e-mail : </span>
    <div id="champs"><input type="text" name="Email" /></div><br />
    <span class="petitvert">Confirmtion de l'adresse e-mail : </span>
    <div id="champs"><input type="text" name="Confirmation_Email" /></div><br /><br/>
    <span class="petitvert">Recopiez s'il vous plait ce le contenu de l'image ci-dessous : (Système anti-robot)  </span><br /><br /><br />
		<p><div id="reglement">
		  <p class="normalgris">Bonjour et bienvenue sur J.Newb. Nous sommes heureux de vous avoir parmi nous. <br />
		    Cependant pour être membre de notre site, vous devez accepter notre règlement. :) </p>
		  <p class="normalgris"><strong>Règlement du site :</strong></p>
		  <p class="normalvert">- Ne pas écrire en langage SMS, ou encore en majuscule.<br />
		    - Ne pas manquer de respect aux membres du site. <br />
		    - Ne pas poster de message à  caractère injurieux, raciste, xénophobe, sexuel, illégal, ou incitant à la haine.<br />
	        - Les message publicitaire ne sont pas autorisés.</p>
		  <p class="normalgris">En cas de litige ou de non respect du règlement, l'équipe de J.Newb pourrait prendre des sanctions envers le ou les fauteurs de troubles. <br />
	      En cas de litige grave, votre adresse IP est conservé dans notre base de donnée et permettra de retrouver le fautif afin d'engager des poursuites.</p>
		  <p class="normalgris">J.Newb stock vos informations dans une base de donnée, mais ils ne sont dans aucun cas redistribué à tierce personne. Vos informations personnels sont entre de bonne main. :) </p>
		  <p class="normalgris">Les conseils de J.Newb pour que tout ce passe dans le meilleur des mondes : :) </p>
		  <p class="normalgris">Toujours rester polis mais aussi avoir un minimum de courtoisie. <br />
	      Si vous posez une question essayez d'être le plus précis possible afin les internautes puivent vous répondre de manière juste. </p>
		  <p class="normalgris">Nous espérons que votre venue sur J.Newb vous sera agréable. ;) </p>
		</div>
        </p><br/><br/><br/>
    <input name="validation" type="submit" value="S'enregistrer" />
	</form>
	<div id="copyright">
    <p class="petitnoire"> J.Newb © 2009 </p>
    </div>
</div>
 
<div id="foot">
<span class="petitnoire">Nous contacter : <a href="[email protected]" class="petitnoire">[email protected]</a></span></div>
</body>
</html>
Et ma Table.

Vous remarquerez que j'ai rajouté quelques petites choses pas encore exploité dans mon script, c'est pour après. :p

Image

Voilààààààààààààààààààààààààààààààààààààààààà :D

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

31 mars 2009, 15:25

Procédure de débugage, first lesson ;)

Problème : Tu affiches toujours le message d'erreur "Champs vides."

Analyse :
- Tu affiches ce message lorsque le switch teste une valeur égale à 3. Pourquoi la valeur est égale à 3 ?
- Tu obtiens une valeur égale à 3 dans le switch lorsque la fonction verif() te retourne 3. Pourquoi la fonction de retourne 3 ?
- la fonction verif() te retourne 3 lorsque l'un de ses paramètres ($pseudo, $mdp, $confirmation_mdp, $email, $confirmation_email) est vide. Pourquoi l'un des paramètres serait-il vide ?
- les paramètres de la fonction sont vides si les valeurs que tu envois sont vides. Quelles sont les valeurs que tu envois à la fonction ?
- tu envois les valeurs des variables : $pseudo, $mdp, $confirmation_mdp, $email, $confirmation_email et $erreur. Que contiennent ces variables ?

=> la variable $pseudo n'existe pas (c'est $Pseudo qui est définie), il est donc logique qu'elle soit toujours vide
=> la variable $confirmation_email n'existe pas non plus (c'est $confirmation_Email) ... même punition :)

Solution : faire attention à pas changer le nom des variables en cours de route (et oui, la casse majuscule/minuscule est importante ;))

Punition : donne tes doigts !!! :twisted:
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 75 Messages

31 mars 2009, 18:37

Yahou !

Je n'ai plus aucune erreur qui s'affiche à l'écran quand je vais sur la page inscription.php. :) Première victoire ! :D

Cependant, quand je m'inscrit et que je regarde dans ma table j'ai ça... :D

Image


Merci. :)

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

31 mars 2009, 18:49

Affiche la variable $insertion qui contient la requête qui te permet d'insérer l'utilisateur en base...

Regarde si les valeurs du pseudo et du mdp sont correcte : si oui, exécute ta requête dans phpMyAdmin pour voir si le résultat est bon; si non bah il ne te reste plus qu'à trouver pourquoi les valeurs ne correspondent pas à ce que tu attends comme je l'ai fait ci-dessus :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 75 Messages

31 mars 2009, 19:05

Quand tu dis afficher, c'est tester ça :
    	$insertion = "INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('".$Pseudo."', '".$pass."', NOW())"; 
dans l'onglet SQL de My Admin ? :)

Si oui, je tombe sur ça : #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 '$insertion = "INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('".$Pseudo."', '".' at line 1

Qu'est ce que tu entends par regarder sir les valeurs du pseudo et mot de passe sont correctes ?

Si je dois exécuter la requête, j'exécute ça ? :)
	$pass = mysql_real_escape_string($Mdp);
	$Pseudo = mysql_real_escape_string($pseudo);
:D

Mammouth du PHP | 991 Messages

31 mars 2009, 21:14

Si tu essaye d'envoyer des variables PHP dans PHPmyAdmin c'est pas gagné.

En essayant de suivre la logique de Ryle , je serais tenter de dire de faire un :

echo $insertion;

Afin de controler que les valeurs soit bien renseigner !!!!


Quand il parle de renseigner les valeurs dans PHPmyAdmin il doit sans doute d'executer une requete du genre :

INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('Je suis un pseudo', 'je suis tout pourri', NOW())

Afin de tester si la syntaxe en elle même est correct.


Bye Hawk
DevOps, Symfony4, Hoa

Eléphant du PHP | 75 Messages

31 mars 2009, 23:01

Merci The Hawk. ;)

Alors, pour le "echo $insertion;", ça ne donne rien... :/

et pour le "INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('Adidas', 'Nike', NOW())" ca work. ;)

:D

Edit : j'ai oublier de préciser tout à l'heure, quand je m'inscrit, j'ai le droit à : "Erreur General". ;)

Mammouth du PHP | 991 Messages

31 mars 2009, 23:08

Tu le fais bien apres la déclaration ???
$insertion = "INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('".$Pseudo."', '".$pass."', NOW())";

echo "Pseudo : ".$Pseudo."<br>Pass : ".$pass."<br>SQL :".$insertion;
Essaye ceci

8-)
DevOps, Symfony4, Hoa

Eléphant du PHP | 75 Messages

01 avr. 2009, 08:33

Quand je vais sur la page inscription.php, ça me donne ça : "Pseudo :
Pass :
SQL :INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('', '', NOW())"

Et quand je m'inscrit : "Erreur général".

:D

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

01 avr. 2009, 10:56

Ouais, alors pour le message "Erreur général" t'as pas d'excuse.... je t'ai expliqué comment trouver pourquoi tu as ce message :
- Tu affiches ce message dans le switch lorsque tu es sous la clause default. Il faut donc vérifier dans quelle condition tu arrives dans le default.
- Tu es dans le défault quand la valeur testée est différente de 1, 2 et 3 (les 3 cases que tu as définis). Il faut vérifier sous quel condition ta valeur est différente de celle prévue.
- La valeur du switch dépend de ce que retourne la fonction verif(). Il faut vérifier ce que retourne la fonction verif()
- La fonction verif() retourne 1, 2 ou 3 en cas d'erreur et 0 en cas de succès.

=> Ton default ne devrait donc pas afficher une "Erreur général", mais au contraire gérer un succès de la vérification.

Ceci étant, je te prierais de bien vouloir prendre une règle dans la main droite et de violement t'assenner un coup sur les doigts de la main gauche ;)


Autre point : tu as une requête pour vérifier l'existence de l'utilisateur en base :
$requete = "SELECT count(*) as nb FROM Membres Where Pseudonyme = '".$nom."'"; 
sauf qu'à aucun moment dans ton code, on ne voit apparaitre la variable $nom


Enfin, il faut rester logique et pas appliquer nos remarques n'importe comment sans se poser de question. Quand je te dis que $Pseudo n'est pas la même chose de $pseudo, il ne faut pas nécessairement renommer toutes tes variables php qui contienne "pseudo" (incluant $_POST['Pseudonyme']).

Tu as un formulaire dans lequel tu as un champ texte. Ce champ texte s'appelle "Pseudonyme" (<input name="Pseudonyme" ... >). Lorsque tu soumets ton formulaire via la méthode post, php va récupérer la valeur de ce champ dans la variable $_POST['Pseudonyme'].
A partir de là, tu récupères la valeur contenue $_POST['Pseudonyme'] et tu la stocke sdans une variable de ton choix (ici tu l'as appellé $Pseudo). Si a la place tu demandes à php la valeur de $_POST['pseudo'], forcément, elle sera vide.
De la même manière, le champ nommé Mdp sera dans $_POST['Mdp'], pas dans $_POST['mdp'], etc. Il faut absolument rester cohérent, php ne tolère pas l'à peu près :)

Ah, et pour finir, vire moi ce test : if ($$Pseudonyme === true) qui ne correspond absolument à rien.... Si tu insères l'utilisateur dans ta base, tu le mets également en session, y a pas de contrôle à faire, à part au mieux, vérifier que l'insertion s'est bien passée... ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...