Système d'inscription made in moi.

Eléphant du PHP | 75 Messages

26 mars 2009, 23:18

Bonjour,

J'étais déjà venu vous voir pour configurer un premier système d'inscription qui buggait. Puis j'ai soudainement eu envie d'en faire un moi même. Je suis grand débutant en PHP, mais un ami m'a mis sur une piste en m'optimisant mon script.

Voilà mon bout de script.

<?php
 
$Pseudonyme         = $_POST['Pseudonyme'];
$Mdp 			    = $_POST['Mdp'];
$Confirmation_mdp   = $_POST['Confirmation_mdp'];
$Email              = $_POST['Email'];
$Confirmation_Email = $_POST['Confirmation_Email'];
$erreur             = null;
 
function erreur($erreur){
	echo("<span class=erreur>Erreur : ".$erreur."</span>");
	exit(0);
}
 
function verif($Pseudonyme,$Mdp,$Confirmation_mdp,$Email,$Confirmation_Email,$erreur){
	if(!empty($Pseudonyme) && !empty($Mdp) && !empty($Confirmation_mdp) && !empty($Email) && $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;
}
 
switch ($erreur = verif($Pseudonyme,$Mdp,$Confirmation_mdp,$Email,$Confirmation_Email)){
		break;
	case 1:
		erreur("Mail");
	case 2:
		erreur("Mdp different ou Email different !");
	case 3:
		erreur("Donnée manquante !");
	default:
		echo "Erreur !";
		break;	
}
	$mysql_connexion = mysql_connect("", "", "");
	mysql_select_db ('Membres', $Membres); 
	
	$compte = 'SELECT compte(*) FROM Membres WHERE Pseudonyme="'..mysql_escape_string($_POST['Pseudonyme']).'"';
	$req = mysql_query($compte) .mysql_error()); 
    $data = mysql_fetch_array($compte); 

}

function compte($data) {
	if ($data[0] == 0) {
	$compte = 'INSERT INTO Membres VALUES("", "'.mysql_escape_string($_POST['Pseudonyme']).'", "'.md5(mysql_escape_string($_POST['Mdp'])).'")';
	mysql_query($sql) .mysql_error()); 
	session_start(); 
    $_SESSION['login'] = $_POST['login']; 
    header('Location: membre.php'); 
    exit(); 
	}
}

?>
Cependant, j'arrive à la partie MySQL. Alors j'aimerais que vous m'aiguillez un peu. Je ne veux pas de script tout fait sachant que c'est moi qui veut le coder à ma sauce. ;)

J'aimerais avoir juste le schéma de construction afin de vérifier si le compte n'est pas déjà existant, et si le champ pseudo ou email est déjà utilisé par un compte. ;)

J'ai aussi une question, je bloque un peu sur la partie MySQL. En effet, je ne sais pas quoi mettre dans ma table. :/

ID
Pseudo
MDP
Confirm MDP ?
Email
Confirm Email ?

Et aussi tout ce qui est valeur, je ne sais pas quoi inscrire. :/

Voilà, merci de m'aider. Ah aussi si vous trouvez quelque chose de bizarre dans le code donné ou même si vous avez des conseils ou toutes remarques, faites m'en part. ;)

Bonne soirée. :)

ViPHP
ViPHP | 1996 Messages

27 mars 2009, 09:56

N'aurais pas tu un problème ici :
if(!empty($Pseudonyme) && !empty($Mdp) && !empty($Confirmation_mdp) && !empty($Email) && ***$Confirmation_Email***
Sinon moi pour éviter une fonction, je fais l'inverse : Je fais d'abord la vérification que le psuedo existe via

$compte = 'SELECT * FROM Membres WHERE pseudonyme="'..mysql_escape_string($_POST['Pseudonyme']).'"';
$req = mysql_query($compte) .mysql_error());
$data = mysql_fetch_assoc($compte);

Ensuite je vérifie que le MDP est bien celui enregistré dans la base : (j'imagine que ton mot de passe est stocké sous forme MD5
if (md5($MDP) == $data["mot_de_passe"])
{
... // al'interieur je fais mes renvoi d'erreur via header 
//la gestion d'erreur se fait via variables  $_GET soit variables de sessions
}
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

ViPHP
AB
ViPHP | 5818 Messages

27 mars 2009, 16:06

Y'a un tuto documenté sur le sujet ici http://www.phpfrance.com/forums/voir_sujet-242539.php

Eléphant du PHP | 75 Messages

27 mars 2009, 20:39

@Aureusms : J'ai corrigé, c'est bon ça ?
	if(!empty($Pseudonyme) && !empty($Mdp) && !empty($Confirmation_mdp) && !empty($Email) && !empty($Confirmation_Email){

@ AB : Merci, je suis d'ailleurs entrain de compléter mon script avec ce tuto. :)

ViPHP
AB
ViPHP | 5818 Messages

27 mars 2009, 21:49

@Aureusms : J'ai corrigé, c'est bon ça ?
	if(!empty($Pseudonyme) && !empty($Mdp) && !empty($Confirmation_mdp) && !empty($Email) && !empty($Confirmation_Email){

@ AB : Merci, je suis d'ailleurs entrain de compléter mon script avec ce tuto. :)
Oui ce code est correct.

Sinon dans ta bdd inutile de mettre les confirmations de mdp ou de mail puisque tu valideras l'inscription si et seulement si ces confirmations sont conformes aux champs initiaux donc cela te ferait des doublons inutiles dans ta bdd :wink:

Eléphant du PHP | 75 Messages

27 mars 2009, 23:03

Ok, ok, merci beaucoup.

Je continu demain, mais la je tient plus debout. :)

Bonne nuit.

ViPHP
AB
ViPHP | 5818 Messages

28 mars 2009, 06:27

T'as raison, vas y cool, tranquille, prends le temps de comprendre; dans la programmation peut-être plus qu'ailleurs il n'y a rien de bon dans la précipitation :wink:

Invité
Invité n'ayant pas de compte PHPfrance

28 mars 2009, 09:46

Ok, ok, merci beaucoup.

Je continu demain, mais la je tient plus debout. :)

Bonne nuit.
Toi tu dois être debout depuis longtemps car 22h00 c'est par tard...
Ah si si je les vois tes yeux tout rouges desséchés par la programmation.:lol:

Juste une petite précision sur ce que je te disais plus haut : Tu ne dois pas stocker tes mots de passe en clair dans ta base. Pour ma part, j'utilise la méthode hash md5() mais visiblement sha1() devient de plus en plus prépondérant car md5() devient moins fiable (surtout à cause des tables de md5() qui traine sur le net.) même si il reste, pour le moment encore, in"dehashable" (il est difficile avec des ordinateurs standards de revenir d'un md5($variable) à $variable)

Eléphant du PHP | 75 Messages

28 mars 2009, 16:14

Alors tu me conseil sha1 () ?

Je me remet à la prog, je vous tient au jus. :)

Edit : Bon je pense avoir finit mon script.

Voici la partie inscription.php.

<?php
 
$Pseudonyme         = $_POST['Pseudonyme'];
$Mdp 			    = $_POST['Mdp'];
$Confirmation_mdp   = $_POST['Confirmation_mdp'];
$Email              = $_POST['Email'];
$Confirmation_Email = $_POST['Confirmation_Email'];
$erreur             = null;
 
function erreur($erreur){
	echo("<span class=erreur>Erreur : ".$erreur."</span>");
	exit(0);
}
 
function verif($Pseudonyme,$Mdp,$Confirmation_mdp,$Email,$Confirmation_Email,$erreur){
	if(!empty($Pseudonyme) && !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;
}
 
switch ($erreur = verif($Pseudonyme,$Mdp,$Confirmation_mdp,$Email,$Confirmation_Email)){ 
	case 1:
		erreur("Mail");
	case 2:
		erreur("Mdp different ou Email different !");
	case 3:
		erreur("Donnée manquante !");
	default:
		echo "Erreur !";
		break;	
}
    $mysql_connexion = mysql_connect("", "", ""); 
    mysql_select_db ('Membres', $Membres);  
	
	$Pseudo = mysql_real_escape_string($Pseudonyme);
	$Pass = sha1($Mdp);
	
	$requete = "SELECT count(*) as nb FROM Membres Where Pseudonyme = '".$nom."'";
	$exe = mysql_querry($requete);
	$tab = mysql_fetch_assoc($exe);
	
	if ($resultat['nb'] == 0)
	{
		$insertion = "INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('".$Pseudonyme."', '".$Mdp."', NOW())"; 
		$inser_exec = mysql_query($insertion);
	
		if ($tab === true)
			{
			session_start();
			$_SESSION['Pseudonyme'] = $Pseudonyme
			}
	}
	
	else 
	{ 
	$message = 'Ce pseudonyme est déjà utilisé. Merci de le modifier.';
	}
	
?>
Malheureusement, j'ai une erreur à la ligne 16 qui est :

	if(!empty($Pseudonyme) && !empty($Mdp) && !empty($Confirmation_mdp) && !empty($Email) && !empty($Confirmation_Email){
Sauf que pour le coup, je sais pas du tout c'est quoi qui merde. :/

Merci. ;)

Mammouth du PHP | 991 Messages

28 mars 2009, 18:28

Ne manquerez t'il pas une ")" ?
DevOps, Symfony4, Hoa

Eléphant du PHP | 75 Messages

28 mars 2009, 19:06

Ouh LoL. :oops:

Honte sur moi... Piètre codeur en PHP. :(

Bon celle ci c'est réglé, mais là j'ai encore une autre erreur... Je sais je suis chiant. :/ Mais pour le coups ce n'est pas une parenthèse manquante. :D

Voici la partie de code ou se trouve l'erreur.

	if ($resultat['nb'] == 0)
	{
		$insertion = "INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('".$Pseudonyme."', '".$Mdp."', NOW())"; 
		$inser_exec = mysql_query($insertion);
	
		if ($tab === true)
			{
			session_start();
			$_SESSION['Pseudonyme'] = $Pseudonyme
			}
	}
	
	else 
	{ 
	$message = 'Ce pseudonyme est déjà utilisé. Merci de le modifier.';
	}
La ligne qui pose problème est le "}" avant "else".

Merci de m'aider, et très bon weekend. ;)

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

28 mars 2009, 20:56

Ne serait-ce pas le point-virgule qui manque au bout de cette ligne qui poserait problème quelques lignes plus bas ?
            $_SESSION['Pseudonyme'] = $Pseudonyme 
;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 75 Messages

28 mars 2009, 23:52

Erreur conne sur erreur conne... :/

Par contre là j'ai un soucis. J'avais une erreur sur la ligne 15 et j'ai rajouté
exit(0);
dans
function verif($Pseudonyme,$Mdp,$Confirmation_mdp,$Email,$Confirmation_Email,$erreur){
	if(!empty($Pseudonyme) && !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;
}
exit(0);
Maintenant ma page reste blanche sans contenue... Même pas de HTML.

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

29 mars 2009, 00:45

La commande exit() indique à php d'arrêter le traitement. Si tu places celui-ci avant d'envoyer du code au navigateur, alors rien ne pourra être affiché...

En l'occurence ici, tu déclares ta fonction verif() et juste après sa déclaration tu demandes à php de s'arrêter... et comme il est un peu bête mais discipliné, il fait ce que tu lui dis et ne va pas plus loin :)

Quand tu as un message d'erreur, prends le temps de le lire et de comprendre ce qui pose problème. Un problème détecté par php ligne 15 peut provenir d'une erreur quelques lignes plus haut, mais qui ne va déranger php qu'à la ligne 15 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 75 Messages

29 mars 2009, 16:23

C'est bon le code est corrigé, je n'ai plus les erreurs maintenant. :)

Cependant afin que mon code soit abouti, j'ai quelques questions.

1) Mon script php à l'air de bien marché, mais quelque chose me chiffonne. En effet, dès que je me rend sur la page inscription.php, j'ai le droit à : Erreur : Données manquantes. Ce qui veut dire que mon script vérifie le contenu de mon formulaire avant même d'avoir récupérer ses valeurs... :p

2) J'aimerais faire un système anti-bot. Je sais qu'on peut employer les images avec le contenu qui change pour ça, mais existe il d'autres moyens plus simple tout aussi efficaces ? :)

3) Pour hashé mon mot de passe, j'ai vu que le sha1 devenait plus intéressant que le vieillissant md5. Cependant pour hashé mes mdp avec cet algo, je fais comment ? :D
$Pass = sha1($Mdp);
Ca suffit ça ?

Pour info, voici mon code php avec les dernières modifications.

<?php
 
$Pseudonyme         = $_POST['Pseudonyme'];
$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($Pseudonyme,$Mdp,$Confirmation_mdp,$Email,$Confirmation_Email,$erreur){
	if(!empty($Pseudonyme) && !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;
}
 
switch ($erreur = verif($Pseudonyme,$Mdp,$Confirmation_mdp,$Email,$Confirmation_Email,$erreur)){ 
	case 1:
		erreur("Mail");
		break;
	case 2:
		erreur("Mdp different ou Email different");
		break;
	case 3:
		erreur("Données manquantes");
		break;
	default:
		echo "Erreur General";	
}
    $mysql_connexion = mysql_connect("", "", ""); 
    mysql_select_db ('Membres', $Membres);  
 
	$Pseudo = mysql_real_escape_string($Pseudonyme);
	$Pass = mysql_real_escape_string($Mdp);
 
	$requete = "SELECT count(*) as nb FROM Membres Where Pseudonyme = '".$nom."'";
	$exe = mysql_query($requete);
	$tab = mysql_fetch_assoc($exe);
 
	if ($resultat['nb'] == 0)
	{
		$insertion = "INSERT INTO Membres(Pseudonyme,Mdp,Date) VALUES('".$Pseudonyme."', '".$Mdp."', NOW())"; 
		$inser_exec = mysql_query($insertion);
 
		if ($tab === true)
			{
			session_start();
			$_SESSION['Pseudonyme'] = $Pseudonyme;
			}
	}
 
	else 
	{ 
	$message = 'Ce pseudonyme est déjà utilisé. Merci de le modifier.';
	}
 
?>
Voilà, merci beaucoup et bon dimanche à tous. :)