8791 sujets

Développement web côté serveur, CMS

Bonjour à tous !
Je conçois actuellement un espace membre en PHP avec une page d'inscription, une page de connexion si les membres sont déjà dans la base, etc.

La page d'inscription marche sans soucis, l'enregistrement dans la base mySql se fait bien, et une fois que l'inscription est terminée, le visiteur est redirigé automatiquement vers sa page perso.

Par contre, là où je bloque, c'est lorsque j'essaie de me connecter avec des identifiants déjà dans la base.
Le message d'erreur que j'ai programmé ("Aucun compte n'est relié aux identifiants que vous avez indiqué") s'affiche en permanence alors que j'ai bien les données enregistrées dans la base...

Structure de la base : ID int (11) - login (text) - pass (text)

Le code que j'utilise est le suivant :

<?php //si le visiteur a soumis le formulaire de contact
if(isset($_POST['connexion']) && $_POST['connexion'] == 'connexion') 
{
if((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) 
{

//connexion à la BDD
include("connexion_BDD.php"); 													

//test si le couple login/pass est présent dans la BDD
$sql = 'SELECT count(*) FROM membres WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass="'.mysql_escape_string($_POST['pass']).'"'; 
$req = mysql_query($sql) or die ('Erreur - '.$sql.' <br> '.mysql_error());
$data = mysql_fetch_array($req); 																						
mysql_free_result($req); 
mysql_close(); 																										

//s'il y a réponse, l'utilisateur est membre
if($data [0] == 1)
{
session_start(); 
$_SESSION['login'] = $_POST['login']; 
header('Location: membre_connecte.php'); 
exit(); 
}
																											
//s'il n'y a pas de réponse, l'utilisateur s'est trompé soit dans son login, soit dans son mot de passe
elseif($data [0] == 0)
{
$erreur = 'Aucun compte n\'est relié aux identifiants que vous avez indiqué'; 
}
									
//si plusieurs membres ont les mêmes identifiants de connexion
else
{
$erreur = 'Plusieurs membres ont les mêmes idenfiants de connexion'; 
}
}
else 
{
$erreur = 'Tous les champs doivent être renseignés'; 
}
}
;?>


Si vous aviez deux, trois pistes pour m'aiguiller, ça m'éviterai de devenir chauve ! Smiley lol

Merci à tous !
mysql_fetch_array retourne une ligne de ton résultat de mysql_query.

Dès lors, $data[0] signifie la première cellule de la ligne retournée. Il n'y a pas de raison que celle-ci soit égale à 1 ou 0 selon l'existance d'un utilisateur (sauf si la première colonne est toujours égale à 1 mais alors c'est stupide de l'avoir).

Ce qui serait mieux, ce serait de faire un appel du type :
$query = mysql_query("SELECT password FROM members WHERE login = '$login' LIMIT 1");
$row = mysql_fetch_array($query);
if(isset($row['password']) && $row['password'] == $_POST['password']) {
     //mot de passe ok
}else{
     //mauvais mot de passe
}

Modifié par pixelb (17 Jan 2010 - 17:58)
Salut,

alors plusieurs remarques :
* !empty(qqch) implique déjà isset(qqch)
* un select count(*) va toujours retourner un enregistrement donc il faut vérifier la valeur :
$sql= 'select count(*) as total from ...';
$result = mysql_query($sql);
$total = mysql_result($result, 0);
if(!empty($total)) {
	// traitement
}
* la variable connexion est inutile : pour vérifier que le formulaire a été soumis :
if($_SERVER['REQUEST_METHOD']=='POST') {
	// ...
}
* ce serait pas mal de hasher les mots de passe (md5, sha1, ...)
Edit:
Heyoan a écrit :
* un select count(*) va toujours retourner un enregistrement donc il faut vérifier la valeur
Désolé : c'est déjà ce que tu fait. Smiley cligne

Donc si ça ne fonctionne pas c'est bien que ta requête ne retourne aucun enregistrement. Il suffit donc de debugger en affichant le contenu de $sql et en la lançant directement dans phpMyAdmin.
Modifié par Heyoan (17 Jan 2010 - 18:25)
Re !

D'abord merci à vous deux pour la rapidité de vos réponses ! Smiley cligne

Je viens de regarder un peu vos pistes, mais malheureusement, ça ne fonctionne pas plus...

J'ai effectivement débuggé entre temps, en affichant le contenu, et ça me retourne bien les différents enregistrements que j'ai dans la BDD ...! Smiley biggol
Alors je ne vois pas...

A tout hasard est-ce que c'est la même chose avec ce code ?
<?php 
if($_SERVER['REQUEST_METHOD'] == 'POST') {	//si le visiteur a soumis le formulaire de contact
	$login = !empty($_POST['login']) ? trim($_POST['login']) : '';
	$pass = !empty($_POST['pass']) ? trim($_POST['pass']) : '';
	if(!empty($login) && !empty($pass)) {
		include("connexion_BDD.php");	//connexion à la BDD
		$sql = sprintf("SELECT * FROM membres WHERE login='%s' AND pass='%s'",
			mysql_real_escape_string($login),
			mysql_real_escape_string($pass));
		$req = mysql_query($sql);
		if(mysql_num_rows($req) > 0) {	//s'il y a réponse, l'utilisateur est membre
			session_start(); 
			$_SESSION['login'] = $login; 
			header('Location: membre_connecte.php'); 
			exit();
		} else{ //s'il n'y a pas de réponse, l'utilisateur s'est trompé soit dans son login, soit dans son mot de passe
			$erreur = "Aucun compte n'est relié aux identifiants que vous avez indiqués"; 
		}
	} else {
		$erreur = 'Tous les champs doivent être renseignés'; 
	}
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test Login/Password</title>
</head>
<body>
<?php
if($erreur) echo '<p style="font-weight: bold; color: red;">'.$erreur.'</p>';
?>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
	<p>
		<label for="login">login :</label>
		<input type="text" name="login" id="login" />
	</p>
	<p>
		<label for="pass">password :</label>
		<input type="password" name="pass" id="pass" />
	</p>
	<p>
		<input type="submit" />
	</p>
</form>
</body>
</html>

Et question bonus : est-ce que tu as des accents ou des caractères particuliers dans tes login/password ?
Auquel cas ça pourrait venir d'un problème d'encodage.


A noter que c'est inutile de vérifier que plusieurs membres ont le même login puisque bien sur tu le testes déjà au moment de l'inscription. Smiley cligne
Modifié par Heyoan (17 Jan 2010 - 19:17)
Malheureusement, ça retourne la même chose...
J'ai essayé d'autres solutions mais rien n'y fait. Smiley bawling
Pour les accents, j'ai veillé depuis le début à ne pas en insérer pour éviter toute erreur d'encodage.

J'y arriverais, j'y arriverais ! Smiley crazy