Problème Log In

Eléphanteau du PHP | 39 Messages

07 août 2011, 21:35

Bonjour, voila j'ai un problème avec un code pour me connecter a mon site : j'ai créer ma base de donnée dans PHPMyAdmin, j'y ai crée un nom d'utilisateur aisi qu'un mot de passe pour tester, et j'ai beau mettre le bon pseudo et le bon pass il ne veut pas me connecter :evil: voici mon code :
<?php
	session_start();
?>
<!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" />
<title>Document sans titre</title>
</head>
<body>
<!-- connexion BDD -->
<?php
	$PARAM_hote='localhost';      // le chemin vers le serveur
	$PARAM_port='3306';
	$PARAM_nom_bd='monsite';          // le nom de votre base de données
	$PARAM_utilisateur='root';    // nom d'utilisateur pour se connecter
	$PARAM_mot_passe='';          // mot de passe de l'utilisateur pour se connecter

		try
			{
			$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
			/* BDD connectee */
			}
 
		catch(Exception $e)
			{
			/* erreur connection */
			echo 'Une erreur est survenue !';
			echo 'Erreur : '.$e->getMessage().'<br />';
			echo 'N° : '.$e->getCode();
			die();
			}
?>
<!--    /fin de la connexion -->
	<?php
	if(isset($_POST) AND !empty($_POST['login']) AND !empty($_POST['pass'])) // si les infos on bien été envoyées
		{
		extract($_POST);
		$pseudo = $_POST['pseudo'];
		$pass = $_POST['pass'];
		$req=$connexion->query("SELECT * FROM user WHERE pseudo='$pseudo' and pass='$pass' "); // Requette MySQL
		$req->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
		$id = $req['id'];
		}
	else
		{
		?>
		<p>Echec de connexion, mauvais pseudo et/ou mauvais mot de passe, <a href="connexion.php" alt="connexion">se connecter</a><br /></p>
		<?php
		}
	if (isset($req) AND (mysql_num_rows($req) > 0) AND ($pass == $req['pass'])) //si la requette a été effecutée ET que l'utilisateur existe ET pass ok
		{
		$pseudo = $_SESSION['pseudo'];
		$pass = $_SESSION['pass'];
		$id = $_SESSION['id'];
		$_SESSION['connexion'] == 1;
		?>
		<p>Connexion réussie, <a href="index.php" alt="index">retourner a l'index</a><br /></p>
		<?php
		}
	else
		{
		?>
		<p>Echec de connexion, mauvais pseudo et/ou mauvais mot de passe, <a href="connexion.php" alt="connexion">se connecter</a><br /></p>
		<?php
		}
Il m'affiche a chaque fois cette phrase que j'ai moi meme indiqué dans mon code :
Echec de connexion, mauvais pseudo et/ou mauvais mot de passe, se connecter
merci

Mammouth du PHP | 2278 Messages

07 août 2011, 22:59

Chalut,




Si je vois bien, ta phrase d'erreur s'affiche à tout coup, puisqu'elle est en-dehors du code php...

En plus, j'ai une sainte horreur de ces codes mélangés; de plus si on n'a pas login et passe, il est inutile de poursuivre et de devoir tester $req, ce qui n'a guère de sens que si on a envoyé une requête...
 if(isset($_POST) AND !empty($_POST['login']) AND !empty($_POST['pass'])) // si les infos ont bien été envoyées
	{
		  extract($_POST);
                $pseudo = $_POST['pseudo'];
                $pass = $_POST['pass'];
                $req=$connexion->query("SELECT * FROM user WHERE pseudo='$pseudo' and pass='$pass' "); // Requette MySQL
                $req->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
                $id = $req['id'];
		if (isset($req) AND (mysql_num_rows($req) > 0) AND ($pass == $req['pass'])) 
                // et si la requête a été effectuée ET que l'utilisateur existe ET pass ok
                {
					$pseudo = $_SESSION['pseudo'];
					$pass = $_SESSION['pass'];
					$id = $_SESSION['id'];
					$_SESSION['connexion'] == 1;
					$message ="<p>Connexion réussie, <a href="index.php" alt="index">retourner a l'index</a><br /></p>";
                }
	        else //et si la requête n'a pas été effectuée ou l'utilisateur n'existe pas ou  pass pas ok
                {
					$message ="<p>Echec de connexion, mauvais pseudo et/ou mauvais mot de passe, <a href="connexion.php" alt="connexion">se connecter</a><br /></p>";
                }	
		} 
        else //______________________________________________________si les infos n'ont pas été bien envoyées
		{
		
			$message = "<p>pseudo et/ou mot de passe non fournis, <a href="connexion.php" alt="connexion">se connecter</a><br /></p>";
		}
      print "$kessage "; ....
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

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

08 août 2011, 00:14

fache toi correctement :)

pourquoi utiliser isset($req) alors que la variable est crée au dessus ?

mysql_num_rows n'a rien à faire ici puisse qu'il utilise PDO !

isset($_POST) AND est totalement inutile puisque $_POST est toujours déclarée (même si aucun formulaire n'est posté !!!!)

extract($_POST);
$pseudo = $_POST['pseudo'];
$pass = $_POST['pass'];

quel intérêt de faire deux fois la même chose !!!

$req->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
$id = $req['id'];

cela montre clairement que l'utilisation de PDO n'est pas comprise !

Exemple de tuto sur PDO http://www.siteduzero.com/tutoriel-3-34 ... x-bdd.html

print "$kessage "; ....

pas besoin de ", d'ou vient $kmessage ?

$pseudo = $_SESSION['pseudo'];
$pass = $_SESSION['pass'];
$id = $_SESSION['id'];
$_SESSION['connexion'] == 1;

totalement illogique vu que l'on met le pseudo en session est non l'inversion, l'affectation se fait de droite a gauche !

j'en ai profiter pour corriger les erreurs sur les chaines de caractères et le tout en fait.
a tester j'ai ptet laisser des aneriesmais il se fait tard pour moi ^^
<?php

 if(!empty($_POST['login']) AND !empty($_POST['pass'])) // si les infos ont bien été envoyées
	{
	$req=$connexion->query('SELECT * FROM user WHERE pseudo='.$connexion->quote($_POST['pseudo'].' and pass='.$connexion->quote($_POST['pass']); // Requette MySQL
	$req->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
	if ( ($req->rowCount() > 0) && ($pass == $req->pass)) 
	// et si la requête a été effectuée ET que l'utilisateur existe ET pass ok
	{
	
		$_SESSION['pseudo'] = $_POST['pseudo'];
		$_SESSION['pass']=$_POST['pass'];
		$id = $_SESSION['id'];
		$_SESSION['connexion'] == 1;
		$message ='<p>Connexion réussie, <a href="index.php" alt="index">retourner a l\'index</a><br /></p>';
	}
	else //et si la requête n'a pas été effectuée ou l'utilisateur n'existe pas ou  pass pas ok
	{
							$message = '<p>Echec de connexion, mauvais pseudo et/ou mauvais mot de passe, <a href="connexion.php" alt="connexion">se connecter</a><br /></p>';
	}       
	$req->closecursor();
	} 
	else //______________________________________________________si les infos n'ont pas été bien envoyées
			{
			
					$message = '<p>pseudo et/ou mot de passe non fournis, <a href="connexion.php" alt="connexion">se connecter</a><br /></p>';
			}
  print $message;
 ?>
@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

08 août 2011, 12:08

J'ai testé et il me dit
( ! ) Parse error: syntax error, unexpected ';' in C:\wamp\www\Code\pages\connect.php on line 38
J'ai regardé pour vérifier que toutes les parenthèses se fermaient, toutes les ' tout ça mais rien a faire toujours cette erreur.

Voici le code :
<?php
	session_start();
?>
<!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" />
<title>Document sans titre</title>
</head>
<body>
<!-- connexion BDD -->
<?php
	$PARAM_hote='localhost';      // le chemin vers le serveur
	$PARAM_port='3306';
	$PARAM_nom_bd='monsite';          // le nom de votre base de données
	$PARAM_utilisateur='root';    // nom d'utilisateur pour se connecter
	$PARAM_mot_passe='';          // mot de passe de l'utilisateur pour se connecter

		try
			{
			$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
			/* BDD connectee */
			}
 
		catch(Exception $e)
			{
			/* erreur connection */
			echo 'Une erreur est survenue !';
			echo 'Erreur : '.$e->getMessage().'<br />';
			echo 'N° : '.$e->getCode();
			die();
			}
?>
<!--    /fin de la connexion -->
<?php
  if(!empty($_POST['login']) AND !empty($_POST['pass'])) // si les infos ont bien été envoyées
         {
         $req=$connexion->query('SELECT * FROM user WHERE pseudo='.$connexion->quote($_POST['pseudo'].' and pass='.$connexion->quote($_POST['pass']); // Requette MySQL
         $req->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
         if ( ($req->rowCount() > 0) && ($pass == $req->pass)) 
         // et si la requête a été effectuée ET que l'utilisateur existe ET pass ok
         {
         
                 $_SESSION['pseudo'] = $_POST['pseudo'];
                 $_SESSION['pass']=$_POST['pass'];
                 $id = $_SESSION['id'];
                 $_SESSION['connexion'] == 1;
                 $message ='<p>Connexion réussie, <a href="index.php" alt="index">retourner a l\'index</a><br /></p>';
         }
         else //et si la requête n'a pas été effectuée ou l'utilisateur n'existe pas ou  pass pas ok
         {
                                                         $message = '<p>Echec de connexion, mauvais pseudo et/ou mauvais mot de passe, <a href="connexion.php" alt="connexion">se connecter</a><br /></p>';
         }       
         $req->closecursor();
         } 
         else //______________________________________________________si les infos n'ont pas été bien envoyées
                         {
                         
                                         $message = '<p>pseudo et/ou mot de passe non fournis, <a href="connexion.php" alt="connexion">se connecter</a><br /></p>';
                         }
   print $message;
  ?>
Merci

Mammouth du PHP | 19672 Messages

08 août 2011, 12:26

Et pourtant il manque bien une parenthèse, et même 2, compte bien ligne 38 de ton code.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 39 Messages

08 août 2011, 14:42

J'ai corrigé la ligne 38, la voila :
$req=$connexion->query('SELECT * FROM user WHERE pseudo='.$connexion->quote($_POST['pseudo']).' and pass='.$connexion->quote($_POST['pass']).' ');
Mais il n'accepte toujours pas de me connecter, j'ai pourant essayer d'autres utilisateurs (en les créant avec PhpMyAdmin) mais ça ne marche pas. Encore une erreur ? Merci

Mammouth du PHP | 19672 Messages

08 août 2011, 14:53

Essaye la chose suivante : fais afficher dans ta page la requête qui est dynamiquement générée et teste-la dans phpMyAdmin, reviens avec le résultat et éventuellement le message d'erreur s'il y en a un.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 39 Messages

08 août 2011, 15:11

il ne veut pas afficher la requette avec print il met :
( ! ) Notice: Undefined variable: req in C:\wamp\www\Code\pages\connect.php on line 62
Call Stack
# Time Memory Function Location
1 0.0023 380256 {main}( ) ..\connect.php:0

Mammouth du PHP | 19672 Messages

08 août 2011, 15:19

Forcément, gros malin, tu essayes de faire afficher la ressource et non la requête. Ça veut dire qu'il faut créer une variable contenant ta requête dynamique avant la ligne où tu utilises $connexion->query et entre les deux utilise un var_dump(), comme ceci :
<?php
$sql = 'SELECT * FROM user WHERE pseudo='.$connexion->quote($_POST['pseudo']).' and pass='.$connexion->quote($_POST['pass']).' ';
echo("<pre>\n");
var_dump($sql);
echo("</pre>\n");
$req = $connexion->query($sql);
Et là tu vas voir qu'il manque quelque chose d'important dans ta requête. L'exécution déclenche une erreur qui doit te dire qu'une colonne n'existe pas... et pour cause, ce n'est pas une colonne de la table.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 39 Messages

08 août 2011, 15:37

j'ai rajouté ça a mon code, qui est donc maintenant :

connect.php
<?php
	session_start();
?>
<!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" />
<title>Document sans titre</title>
</head>
<body>
<!-- connexion BDD -->
<?php
	$PARAM_hote='localhost';      // le chemin vers le serveur
	$PARAM_port='3306';
	$PARAM_nom_bd='monsite';          // le nom de votre base de données
	$PARAM_utilisateur='root';    // nom d'utilisateur pour se connecter
	$PARAM_mot_passe='';          // mot de passe de l'utilisateur pour se connecter

		try
			{
			$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
			/* BDD connectee */
			}
 
		catch(Exception $e)
			{
			/* erreur connection */
			echo 'Une erreur est survenue !';
			echo 'Erreur : '.$e->getMessage().'<br />';
			echo 'N° : '.$e->getCode();
			die();
			}
?>
<!--    /fin de la connexion -->
<?php
  if(!empty($_POST['login']) AND !empty($_POST['pass'])) // si les infos ont bien été envoyées
         {
		 $sql = 'SELECT * FROM user WHERE pseudo='.$connexion->quote($_POST['pseudo']).' and pass='.$connexion->quote($_POST['pass']).' ';
		echo("<pre>\n");
		var_dump($sql);
		echo("</pre>\n");
		$req = $connexion->query($sql);
         $req->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
         if ( ($req->rowCount() > 0) && ($pass == $req->pass)) 
         // et si la requête a été effectuée ET que l'utilisateur existe ET pass ok
         {
         
                 $_SESSION['pseudo'] = $_POST['pseudo'];
                 $_SESSION['pass']=$_POST['pass'];
                 $id = $_SESSION['id'];
                 $_SESSION['connexion'] == 1;
                 $message ='<p>Connexion réussie, <a href="index.php" alt="index">retourner a l\'index</a><br /></p>';
         }
         else //et si la requête n'a pas été effectuée ou l'utilisateur n'existe pas ou  pass pas ok
          {
                                                          $message = '<p>Echec de connexion, mauvais pseudo et/ou mauvais mot de passe, <a href="connexion.php" alt="connexion">se connecter</a><br /></p>';
          }       
          $req->closecursor();
          } 
          else //______________________________________________________si les infos n'ont pas été bien envoyées
                          {
                          
                                          $message = '<p>pseudo et/ou mot de passe non fournis, <a href="connexion.php" alt="connexion">se connecter</a><br /></p>';
                          }
    print $message;
   ?>
  
et il me dit que le pseudo et/ou le mdp n'est pas fourni, alors j'ai vérifé ma page précédente avec le formulaire de connexion (pour voir si le formulaire pointe vers la bonne page) mais je ne trouve pas d'erreur ... voici le formulaire :

connexion.php
<form action="connect.php" method='post'>
		<table align="center" border="0">
			<tr>
				<td>Pseudo :</td>
				<td><input type="text" name="pseudo" maxlength="250"></td>
			</tr>
			<tr>
				<td>Mot de Passe :</td>
				<td><input type="password" name="pass" maxlength="250"></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><input type="submit" value="Connexion"></td>
			</tr>
		</table>
	</form>

Mammouth du PHP | 19672 Messages

08 août 2011, 16:12

Normalement ce code aurait dû afficher la requête directement dans la page : c'est cette requête qui comporte une erreur, deux en réalité puisque ça concerne deux éléments qui ont le même problème.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 39 Messages

08 août 2011, 16:24

Et c'est quoi le problème de la requete ? c'est celle qui m'a été indiquée dans les premières réponses du sujet.

Mammouth du PHP | 19672 Messages

08 août 2011, 16:29

:roll: Quel manque de sens de l'observation...

Quelle différence relèves-tu entre cette requête :
$sql  = 'SELECT * '.
        'FROM user '.
        'WHERE pseudo='.$connexion->quote($_POST['pseudo']).' '.
        'and pass='.$connexion->quote($_POST['pass']).' ';
Et celle-ci :
$sql  = "SELECT * ".
        "FROM user ".
        "WHERE pseudo='". $connexion->quote($_POST['pseudo']) ."' ".
        "AND pass='". $connexion->quote($_POST['pass']) ."'";
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 39 Messages

08 août 2011, 17:07

la premiere est avec des simples guillemets ' la seconde avec des doubles "
Mais dans toutes les réponses les requettes étaient avec des simples ' ...

Mammouth du PHP | 19672 Messages

08 août 2011, 17:52

Il y a un détail supplémentaire que tu ne sembles pas avoir remarqué, observe mieux ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: