Page 1 sur 1

Optimisation de code

Posté : 13 oct. 2007, 15:07
par Kaoteknik
Bonjour à tous,

j'ai écrit un code qui permet d'effectuer différents contrôles sur un formulaire de connexion, mais je pense que celui-ci pourrait être amélioré. Si vous pouviez me faire quelques suggestions à ce sujet, j'en serais ravi.

Voici le code en question :
<?php
session_start();

$pseudo = $_POST['pseudo'];
$pass = $_POST['pass'];

$validite_formulaire = true;
$message_erreur = 'La connexion n\'a pas pu &egrave;tre &eacute;tablie pour la(les) raison(s) suivante(s) :<br />';

require_once('configbdd.php');

$connexion = mysql_connect($dbhost, $utilisateur, $mdp) or die(mysql_error());
mysql_select_db($bdd, $connexion) or die(mysql_error());

$requete_1 = ("SELECT id FROM users WHERE pseudo='$pseudo'");
$requete_2 = ("SELECT id FROM users WHERE pass='$pass'");
$requete_3 = ("SELECT pseudo FROM users");
$resultat_1 = mysql_query($requete_1) or die (mysql_error());
$resultat_2 = mysql_query($requete_2) or die (mysql_error());
$resultat_3 = mysql_query($requete_3) or die (mysql_error());
$selection_1 = mysql_fetch_array($resultat_1);
$selection_2 = mysql_fetch_array($resultat_2);
$selection_3 = mysql_fetch_array($resultat_3);

// On vérifie que le champ "Pseudo" a bien été rempli
if (empty($pseudo)) {
	$validite_formulaire = false;
	$message_erreur .= '- Vous n\'avez pas rempli le champ "Login".<br />';
}

// On vérifie que le champ "Pass" a bien été rempli
if (empty($pass)) {
	$validite_formulaire = false;
	$message_erreur .= '- Vous n\'avez pas rempli le champ "Pass".<br />';
}

// On contrôle que le mot de passe appartient bien à la personne qui se connecte
if ($selection_1['id'] != $selection_2['id']) {
	$validite_formulaire = false;
	$message_erreur .= '- Le mot de passe que vous avez indiqu&eacute; ne correspond pas au pseudo.<br />';
}

// On vérifie que le pseudo existe dans la base de données
if ($_SESSION['pseudo'] != $selection_3['pseudo']) {
	$validite_formulaire = false;
	$message_erreur .= '- Votre login n\'existe pas dans la base de donn&eacute;e. Vous devez vous enregistrer pour acc&eacute;der au contenu.<br />';
}


// Si toutes les vérifications sont validées, on créé des cookies et on redirige l'utilisateur vers la page d'accueil
if ($validite_formulaire = true) {
	$expiration = time() + 365*24*3600;
	setcookie('pseudo', $pseudo, $expiration);
	setcookie('pass', $pass, $expiration);
	include('accueil.php');
}
else {
	echo $message_erreur;
}	

?>

Posté : 13 oct. 2007, 15:56
par jojolapine
Alors quelques petites améliorations à faire...
Déja, tu effectues toutes tes requêtes avant de savoir si ça en vaut la peine, c.a.d. que si l'un des deux champs du formulaire n'est pas remplis, inutile d'interroger la base de donnée...
Ensuite, concernant ta vérification dans la base de donnée, c'est faisable en une seule requête
il suffit de faire

Code : Tout sélectionner

SELECT count(*) as nb FROM users WHERE pseudo='$pseudo' AND pass='$pass'
Ensuite, tu test le retour, si nb=0 alors soit le pseudo n'existe pas, soit le pseudo et le passe ne correspondent pas...
Si nb=1 alors le bonhomme est "clean"...
J'ai pas regardé plus en détail, met déja en place ce que je t'aid it, puis reviens nous voir avec le nouveau code ;)

Posté : 15 oct. 2007, 19:42
par Kaoteknik
Bien, je n'ai pas trop eu le temps ces derniers jours de me pencher sur le problème, je m'y suis donc attelé ce soir. Après avoir suivi tes conseils, voici le code modifié :
$pseudo = $_POST['pseudo'];
$pass = $_POST['pass'];
$validite_formulaire = true;
$message_erreur = 'La connexion n\'a pas pu &egrave;tre &eacute;tablie pour la(les) raison(s) suivante(s) :<br />';

if (empty($pseudo) || empty($pass)) {
	$validite_formulaire = false;
	if (empty($pseudo)) {
		$message_erreur .= '- Vous n\'avez pas rempli le champ "Login".<br />';
		echo $message_erreur;
	}
	if (empty($pass)) {
		$message_erreur .= '- Vous n\'avez pas rempli le champ "Pass".<br />';
		echo $message_erreur;
}
else {
	require_once('configbdd.php');

	$connexion = mysql_connect($dbhost, $utilisateur, $mdp) or die(mysql_error());
	mysql_select_db($bdd, $connexion) or die(mysql_error());
	
	$requete = ("SELECT count(*) as nb FROM users WHERE pseudo='$pseudo' AND pass='$pass'");
	$resultat = mysql_query($requete) or die (mysql_error());
	$selection = mysql_fetch_array($resultat);
	
	if ($selection['nb'] == 0) {
		$validite_formulaire = false;
		$message_erreur .= 'Le mot de passe que vous avez indiqu&eacute; ne correspond pas au pseudo ou votre login n\'existe pas dans la base de données.';
		echo $message_erreur;
	}
	else {
		session_start();
		$expiration = time() + 365*24*3600;
		setcookie('pseudo', $pseudo, $expiration);
		setcookie('pass', $pass, $expiration);
		header ('location:accueil.php');
	}
}

Vu de cette façon ça paraît en effet plus "propre". Cela dit je n'ai pas encore testé si mon code était viable une fois en ligne. Je vais de ce pas l'appliquer et le retourner dans tous les sens ! :roll:

Je repasserais pour confirmer si tout est en ordre ou si au contraire rien ne va plus ! :wink:

Posté : 15 oct. 2007, 20:38
par Kaoteknik
Bon, le code tel quel retourne bien une erreur si les champs pseudo ou mot de passe ne sont pas remplis. Tout va donc bien jusque là.

Par contre là où ça ne va plus c'est lorsque je contrôle si le mot de passe ou le login existent bien dans la BDD ou si les deux coïncident bien l'un avec l'autre... Même si j'indique des paramètres censés me rediriger vers la page d'accueil, j'ai systématiquement le message d'erreur correspondant qui s'affiche.

Je vais tenter de trouver le problème et je reviendrais ! :)

Posté : 15 oct. 2007, 23:30
par Kaoteknik
Bon, j'ai encore modifié le code mais cela ne fonctionne toujours pas comme je le souhaiterais, à savoir que je cherche à distinguer deux champs "id" afin de m'assurer que le pseudo et le pass indiqués possèdent bien le même et, si tel n'est pas le cas que cela m'affiche le message d'erreur correspondant. Voici à quoi je me suis arrêté pour le moment :
$login = $_POST['login'];
$pass = $_POST['pass'];
$validite_formulaire = true;
$message_erreur = 'La connexion n\'a pas pu &ecirc;tre &eacute;tablie pour la(les) raison(s) suivante(s) :<br />';

if (empty($login) || empty($pass)) {
	$validite_formulaire = false;
	if (empty($login)) {
		$message_erreur .= '- Vous n\'avez pas rempli le champ "Login".<br />';
	}
	if (empty($pass)) {
		$message_erreur .= '- Vous n\'avez pas rempli le champ "Pass".<br />';
	}
}
else {
	require_once('configbdd.php');

	$connexion = mysql_connect($dbhost, $utilisateur, $mdp) or die(mysql_error());
	mysql_select_db($bdd, $connexion) or die(mysql_error());
	
	$requete = ("SELECT COUNT(DISTINCT id) FROM users WHERE login='$login' AND pass='$pass'");
	$resultat = mysql_query($requete) or die (mysql_error());
	$selection = mysql_fetch_array($resultat);
	
	if ($selection['id'] != 1) {
		$validite_formulaire = false;
		$message_erreur .= 'Le mot de passe que vous avez indiqu&eacute; ne correspond pas au pseudo ou votre login n\'existe pas dans la base de donn&eacute;es.';
	}
}

if ($validite_formulaire == false) {
	echo $message_erreur;
}
else {
	session_start();		
	$expiration = time() + 365*24*3600;		
	setcookie('pseudo', $pseudo, $expiration);
	setcookie('pass', $pass, $expiration);
	header ('location:accueil.php');
}
A partir de maintenant je tiens le forum PHP France comme personnellement responsable de mes tempes grisonnantes ! :lol:

Posté : 16 oct. 2007, 21:13
par Kaoteknik
Bonsoir à tous,

après avoir longuement réfléchi au problème j'ai enfin trouvé la solution ! :)

Voici la portion de code que j'ai modifiée :
else {
	require_once('configbdd.php');

	$connexion = mysql_connect($dbhost, $utilisateur, $mdp) or die(mysql_error());
	mysql_select_db($bdd, $connexion) or die(mysql_error());
	
	$requete = ("SELECT pass FROM users WHERE login='$login'");
	$resultat = mysql_query($requete) or die (mysql_error());
	$selection = mysql_fetch_array($resultat);
	
	if ($selection['pass'] != $pass) {
		$validite_formulaire = false;
		$message_erreur .= 'Le mot de passe que vous avez indiqu&eacute; ne correspond pas au pseudo ou votre login n\'existe pas dans la base de donn&eacute;es.';
	}
}
Désormais tout semble fonctionner comme je le désirais. Au passage je vous prie de m'excuser pour le multi-post. Comme le problème est résolu j'éviterai de poster encore ici... :)

Merci.