Problème avec login et pass

zana
Invité n'ayant pas de compte PHPfrance

04 mars 2012, 11:53

salut j'ai eu un code sur le net que j'essaie de l'adapter mais j'arrive pas .
il s'agit de permettre aux utilisateurs de s'identifier avant de se connecter .
le code n'affiche aucune erreur mais ne me dirige pas vers la page souhaitée . en plus je veux qu'à chaque fois qu'on revient sur la page pour s'identifier les champs soient vides .
merci de bien vouloir m'aider
voici la table que j'ai crée :

-- Structure de la table `membre`
--

CREATE TABLE IF NOT EXISTS `membre` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` text COLLATE utf8_unicode_ci NOT NULL,
`pass_md5` text COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;

--
-- Contenu de la table `membre`
--

INSERT INTO `membre` (`id`, `login`, `pass_md5`) VALUES
(1, 'admin', '21232f297a57a5a743894a0e4a801fc3'),
(2, 'sool', '624fbbcb1b3567572e39d302f3e018fc'),
(3, 'zana', '9734c1859c07d4ca1a7034659db2594c');

voici mon code :
<?php
// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
	if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

		include("connection.php"); 

		// on teste si une entrée de la base contient ce couple login / pass
		$sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"';
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		$data = mysql_fetch_array($req);

		mysql_free_result($req);
		mysql_close();
		// si on obtient une réponse, alors l'utilisateur est un membre
		if ($data[0] == 1) {
			session_start();
			$_SESSION['login'] = $_POST['login'];
			header('Location: logo.php');
			exit();
		}
		// si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
		elseif ($data[0] == 0) {
			$erreur = 'Compte non reconnu.';
		}
		// sinon, alors la, il y a un gros problème :)
		else {
			$erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
		}
	}
	else {
		$erreur = 'Au moins un des champs est vide.';
	}
}
?>
<html>
<head>
<title>Accueil</title>
<style type="text/css">
<!--
.Style6 {color: #FFFFFF; font-style: italic; font-weight: bold; }
.Style7 {
	color: #FFFFFF;
	font-style: italic;
}
.Style8 {color: #FF00FF}
-->
</style>
</head>

<body>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
</p>
<form action="index.php" method="post">
<br />
<table border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#FF00FF">
  <td height="65" width="80"><table width="536" height="139" border="0" align="center" bgcolor="#0A5B79">
    <tr>
      <td colspan="2"><table width="512" border="0" align="center">
        <tr>
          <td width="395"><h1 align="center" class="Style8">Identifiez-vouz !! </h1></td>
          <td width="101"><img src="images/logo3.jpg" alt="dfghj" width="100" height="70"></td>
        </tr>
      </table>
      </td>
    </tr>
    <tr>
      <td width="109"><span class="Style6">Login : </span></td>
      <td width="417"><input type="text" name="login" value="<?php if (isset($_POST['login'])) echo htmlentities(trim($_POST['login'])); ?>"></td>
    </tr>
    <tr>
      <td><span class="Style6">Mot de passe : </span></td>
      <td><input type="password" name="pass" value="<?php if (isset($_POST['pass'])) echo htmlentities(trim($_POST['pass'])); ?>"></td>
    </tr>
    <tr>
      <td colspan="2"><table width="53" border="0" align="center">
          <tr>
            <td width="47"><input type="submit" name="connexion" value="connexion"></td>
          </tr>
        </table>
          <table width="100" border="0" align="right">
            <tr>
              <td width="94"><a href="inscription.php" class="Style7">Vous inscrire</a></td>
            </tr>
        </table></td>
    </tr>
  </table></td>
</table>
<br />
</form>

<?php
if (isset($erreur)) echo '<br /><br />',$erreur;
?>
</body>
</html>

ViPHP
xTG
ViPHP | 7331 Messages

04 mars 2012, 12:14

Le code m'a l'air très bien. Hormis le fait qu'utiliser empty et isset en même temps n'a pas beaucoup d'intérêt.
Pour supprimer les valeurs dans le formulaire il te suffit de supprimer le code référençant l'attribut value.
Peux-tu vérifier le code source renvoyé par le navigateur pour vérifier qu'il n'y a vraiment aucune erreur ? (bien que tu n'as pas l'air d'avoir de CSS permettant de cacher une quelconque information à l'écran)

Mammouth du PHP | 2278 Messages

04 mars 2012, 12:32

// on teste si une entrée de la base contient ce couple login / pass
$sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error())
pourrait devenir:
               $sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"';
print "<br>$sql<br>"; die();
                $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error())
histoire de voir ce que la requête a dans le ventre.
Moi je n'aime pas mêler tout et j'écrirais plus volontiers:
$login_saisi = mysql_escape_string($_POST['login']);
$pass_saisi = mysql_escape_string(md5($_POST['pass']));
 $sql = "SELECT count(*) FROM membre WHERE `login`='$login_saisi'  AND `pass_md5`='$pass_saisi'";
qui permet de vérifier séparément les éléments et rend la requête plus lisible
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 162 Messages

04 mars 2012, 14:46

j'ai mi
print "<br>$sql<br>"; die();
print "<br>$sql<br>"; die(); mais rien ne s'affiche . ça me ramène toujours sur la même page c'est à dire la page de login

ViPHP
xTG
ViPHP | 7331 Messages

04 mars 2012, 15:13

Quel est le code de la page logo.php ? Le problème pourrait venir de là...

Eléphant du PHP | 162 Messages

04 mars 2012, 15:23

voici le code de logo.php
<?php
session_start();
if (!isset($_SESSION['login'])) {
	header ('Location: index.php');
	exit();
}
?>
Bienvenue----<?php echo htmlentities(trim($_SESSION['login'])); ?>!<br />
<!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=iso-8859-1" />
<title>Document sans titre</title>
<script type="text/JavaScript">
<!--
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
//-->
</script>
</head>

<body onload="MM_preloadImages('images/logo2.jpg')">

<a href="deconnexion.php">Déconnexion</a>
<p><a href="#" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('logo1','','images/logo2.jpg',1)"></a>
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table width="1206" height="146" border="0" align="center">
  <tr>
    <td colspan="8">&nbsp;</td>
  </tr>
  <tr>
    <td width="124"><img src="images/images (3).jpg" alt="41" width="124" height="125" /></td>
    <td width="130"><img src="images/images (2).jpg" alt="4" width="130" height="131" /></td>
    <td width="148"><img src="images/images.jpg" alt="11" width="148" height="147" /></td>
    <td width="164"><img src="images/images (8).jpg" alt="1" width="164" height="146" /></td>
    <td width="158"><img src="images/images (5).jpg" alt="4" width="144" height="161" /></td>
    <td width="150"><img src="images/pc-portable.jpg" alt="401" width="150" height="150" /></td>
    <td width="150"><img src="images/LD0000901222_1.jpg" alt="11" width="150" height="150" /></td>
    <td width="150"><img src="images/moniteurlcd.jpg" alt="11" width="150" height="150" /></td>
  </tr>
  <tr>
    <td colspan="8"><table width="1198" border="0">
      <tr>
        <td bgcolor="#0A5B79">&nbsp;</td>
      </tr>
    </table></td>
  </tr>
</table>
<p>&nbsp;</p>
<table width="200" border="0" align="center" bordercolor="#0F5A7A">
  <tr>
    <td><a href="#" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('logo1','','images/logo2.jpg',1)"><img src="images/logo1.jpg" alt="edfghjk" name="logo1" width="905" height="215" border="0" id="logo1" /></a></td>
  </tr>
</table>
<table width="115" border="0" align="center">
  <tr>
    <td width="109"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" width="105" height="21" title="ENTRER">
      <param name="movie" value="button104.swf" />
      <param name="quality" value="high" />
      <embed src="button104.swf" quality="high" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="105" height="21" ></embed>
    </object></td>
  </tr>
</table>
<p>&nbsp;</p>
</body>
</html>

Mammouth du PHP | 2278 Messages

04 mars 2012, 15:40

j'ai mi
print "<br>$sql<br>"; die();
print "<br>$sql<br>"; die(); mais rien ne s'affiche . ça me ramène toujours sur la même page c'est à dire la page de login
Vérifie que tu passes bien dans le if:
<?php
// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
        if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {
print "<br>On est dans le if"; die();
Si oui;
Modifie mon print en
print "<br> la requête $sql<br>"; die();
et si la requête est vide, teste ma deuxième solution en faisant afficher $login_saisi et $pass_saisi...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 162 Messages

04 mars 2012, 16:11

je viens de tenter ta deuxième solution mais toujours la même chose :

voici la partie :
	// on teste si une entrée de la base contient ce couple login / pass
		$login_saisi = mysql_escape_string($_POST['login']);
               $pass_saisi = mysql_escape_string(md5($_POST['pass']));
               $sql = "SELECT count(*) FROM membre WHERE `login`='$login_saisi'  AND `pass_md5`='$pass_saisi'";
	       $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		echo $login_saisi;
		echo $pass_saisi;
		$data = mysql_fetch_array($req);

		mysql_free_result($req);

ViPHP
xTG
ViPHP | 7331 Messages

04 mars 2012, 17:23

Okay, possibilité de session_start() qui fonctionne pas à cause de caractères parasites donc. (tout du moins mon hypothèse se base sur le fait que le login fonctionne et qu'il te redirige vers logon.php puis à cause de la session inexistante vers index.php)
Commentes la fonction header() pour qu'elle ne s'exécute pas.
Et tentes de te connecter, soit tu tombes sur une page blanche et là faudra aller voir du côté des logs du serveur, soit tu auras l'erreur d'affichée.

Eléphant du PHP | 162 Messages

04 mars 2012, 18:02

je viens de commenter le fonction header() et quand je me connecte ça me ramène toujours sur la même page de login .
je remet le code entier .

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

		include("connection.php"); 

		// on teste si une entrée de la base contient ce couple login / pass
	      // on teste si une entrée de la base contient ce couple login / pass
                $sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"';
                $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
                $data = mysql_fetch_array($req);
		
                mysql_free_result($req);
	
		        mysql_close();
		// si on obtient une réponse, alors l'utilisateur est un membre
		if ($data[0] == 1) {
			session_start();
			$_SESSION['login'] = $_POST['login'];
			header('Location: logo.php');
			exit();
		}
		// si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
		
		elseif ($data[0] == 0) {
			$erreur = 'Compte non reconnu.';
		}
		// sinon, alors la, il y a un gros problème :)
		else {
			$erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
		}
	}
	else {
		$erreur = 'Au moins un des champs est vide.';
	}
	echo $req;
}
?>
<html>
<head>
<title>Accueil</title>
<style type="text/css">
<!--
.Style6 {color: #FFFFFF; font-style: italic; font-weight: bold; }
.Style7 {
	color: #FFFFFF;
	font-style: italic;
}
.Style8 {color: #FF00FF}
-->
</style>
</head>

<body>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
</p>
<form action="index.php" method="post">
<br />
<table border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#FF00FF">
  <td height="65" width="80"><table width="536" height="139" border="0" align="center" bgcolor="#0A5B79">
    <tr>
      <td colspan="2"><table width="512" border="0" align="center">
        <tr>
          <td width="395"><h1 align="center" class="Style8">Identifiez-vouz !! </h1></td>
          <td width="101"><img src="images/logo3.jpg" alt="dfghj" width="100" height="70"></td>
        </tr>
      </table>
      </td>
    </tr>
    <tr>
      <td width="109"><span class="Style6">Login : </span></td>
      <td width="417"><input type="text" name="login" value="<?php if (isset($_POST['login'])) echo htmlentities(trim($_POST['login'])); ?>"></td>
    </tr>
    <tr>
      <td><span class="Style6">Mot de passe : </span></td>
      <td><input type="password" name="pass" value="<?php if (isset($_POST['pass'])) echo htmlentities(trim($_POST['pass'])); ?>"></td>
    </tr>
    <tr>
      <td colspan="2"><table width="53" border="0" align="center">
          <tr>
            <td width="47"><input type="submit" name="connexion" value="login"></td>
          </tr>
        </table>
          <table width="100" border="0" align="right">
            <tr>
              <td width="94"><a href="inscription.php" class="Style7">Vous inscrire</a></td>
            </tr>
        </table></td>
    </tr>
  </table></td>
</table>
<br />
</form>

<?php
if (isset($erreur)) echo '<br /><br />',$erreur;
?>
</body>
</html>

ViPHP
xTG
ViPHP | 7331 Messages

04 mars 2012, 19:52

C'est bien ce header là que tu as commenté ?
header('Location: logo.php');
Cela voudrait dire qu'il ne rentre pas dans la condition de validation du formulaire donc.
Mets un var_dump($_POST) en haut de script pour vérifier ce qu'envoie le formulaire.
Et mets un affichage après chaque if pour tester leur validation.

Eléphant du PHP | 162 Messages

04 mars 2012, 21:57

oui c'est bien
header('Location: logo.php');
que j'ai commenté .
j'ai mis : var_dump($_POST)

voici ce qui s'affiche :
array(3) { ["login"]=> string(4) "sool" ["pass"]=> string(10) "cool75sool" ["connexion"]=> string(5) "login" }

ViPHP
xTG
ViPHP | 7331 Messages

04 mars 2012, 22:35

["connexion"]=> string(5) "login"
Le voilà le problème, ton code recherche la valeur "connexion" et non "login".

Eléphant du PHP | 162 Messages

04 mars 2012, 22:54

comment je corrige ça ?

ViPHP
xTG
ViPHP | 7331 Messages

04 mars 2012, 23:09

<td width="47"><input type="submit" name="connexion" value="login"></td>