Problème Log In

Eléphanteau du PHP | 39 Messages

08 août 2011, 18:28

Dans la seconde,
 . $connexion->quote($_POST['pseudo']) .    

et
. $connexion->quote($_POST['pass']) .

sont entourés de double-guillemets " alors que dans la première elles ne sont pas entourées de double guillemets.


Dans la première, le "and" est en miniscule, dans la seconde en majuscule.

Mammouth du PHP | 19672 Messages

08 août 2011, 18:36

Toujours pas : pour peut-être mieux voir, mets les deux versions dans ton code et exécute un var_dump de chacun et ensuite compare la sortie, ça sera peut-être plus évident.
<?php
$sql  = 'SELECT * '.
        'FROM user '.
        'WHERE pseudo='.$connexion->quote($_POST['pseudo']).' '.
        'and pass='.$connexion->quote($_POST['pass']).' ';
echo("<pre>Requête originale :\n");
var_dump($sql);
echo("</pre>\n");
$sql  = "SELECT * ".
        "FROM user ".
        "WHERE pseudo='". $connexion->quote($_POST['pseudo']) ."' ".
        "AND pass='". $connexion->quote($_POST['pass']) ."'";
echo("<pre>Requête modifiée :\n");
var_dump($sql);
echo("</pre>\n");
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

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

08 août 2011, 21:49

@cyrano : je suis désolé mais moi je la connais la différence et bien que j'ai oublié des parenthèses (m'y reprendrais a coder sans IDE ^^) la pour le coup les quote c'est normal qu'elle n'y soit pas elles sont mise automatiquement.

Pour l'explication je t'invite a revoir le première exemple de la doc http://www.php.net/manual/fr/pdo.quote.php

quand au problème effectivement, comme tu l'indique il faut debugger mais j'ai pas encore trouvé une appli qui le fait sur mon tel portable :mrgreen:



@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 19672 Messages

08 août 2011, 22:04

Avec de la requête préparée la question ne se poserait pas, mais ce n'est pas le cas ici ;)
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, 22:11

requette préparée ? ça serait plus simple ? Parce que là j'ai lu mille fois la doc sur PDO::quote, j'ai tout essayé, avec/sans ' et " je comprends vraiment pas ...

Mammouth du PHP | 19672 Messages

08 août 2011, 22:18

requette préparée ? ça serait plus simple ? Parce que là j'ai lu mille fois la doc sur PDO::quote, j'ai tout essayé, avec/sans ' et " je comprends vraiment pas ...
Et pourtant... tu n'as pas du exécuter le code tel que je te l'ai indiqué.


Remplaçons les variables pas des valeurs telles qu'elles seraient envoyée vers la base et observons :
SELECT * 
FROM user
WHERE pseudo=monpseudo
and pass=monmotdepasse
Et modifiée :
SELECT * 
FROM user
WHERE pseudo='monpseudo'
AND pass='monmotdepasse'
Là ça devrait être beaucoup plus évident.
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, 22:25

Voila j'ai fait une requette préparée, la voila :
$req = $connexion->prepare('SELECT * FROM user WHERE pseudo = :pseudo AND pass = :pass');
$req->execute(array('pseudo' => $_POST['pseudo'], 'pass' => $_POST['pass']));
mon code complet est donc maintenant :
<?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['pseudo']) AND !empty($_POST['pass'])) // si les infos ont bien été envoyées
         {
$req = $connexion->prepare('SELECT * FROM user WHERE pseudo = :pseudo AND pass = :pass');
$req->execute(array('pseudo' => $_POST['pseudo'], 'pass' => $_POST['pass']));
         $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))                                      LIGNE 41
         // 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'];                                                          LIGNE 47
                 $_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;
	?>
	<?php
$sql  = 'SELECT * '.
         'FROM user '.
         'WHERE pseudo='.$connexion->quote($_POST['pseudo']).' '.
         'and pass='.$connexion->quote($_POST['pass']).' ';
echo("<pre>Requête originale :\n");
var_dump($sql);
echo("</pre>\n");
$sql  = "SELECT * ".
         "FROM user ".
         "WHERE pseudo='". $connexion->quote($_POST['pseudo']) ."' ".
         "AND pass='". $connexion->quote($_POST['pass']) ."'";
echo("<pre>Requête modifiée :\n");
var_dump($sql);
echo("</pre>\n");
   ?>
  
Bonne nouvelle (enfin je crois) : il me dit bien que la connexion est réussie seulement si j'ai bien mit le bon pseudo et le bon mdp, j'ai testé d'autres identifiants inexistants et pour ça c'est sécurisé, seulement il m'indique encore 3 messages d'erreur :
( ! ) Notice: Undefined property: PDOStatement::$pass in C:\wamp\www\Code\pages\connect.php on line 41
Call Stack
# Time Memory Function Location
1 0.0020 386984 {main}( ) ..\connect.php:0
( ! ) Notice: Undefined variable: pass in C:\wamp\www\Code\pages\connect.php on line 41
Call Stack
# Time Memory Function Location
1 0.0020 386984 {main}( ) ..\connect.php:0
( ! ) Notice: Undefined index: id in C:\wamp\www\Code\pages\connect.php on line 47
Call Stack
# Time Memory Function Location
1 0.0020 386984 {main}( ) ..\connect.php:0
Que faire ? Merci

Eléphanteau du PHP | 39 Messages

08 août 2011, 22:27

Ah je n'avais pas vu ta réponse avant de posté ... Et bien il faut que les valeurs du pseudo et du mdp soient entourées de guillemets ' non ? Et je part dans qu'elle direction, requette préparée ou pas ?

Mammouth du PHP | 19672 Messages

08 août 2011, 22:32

À ce compte là si ce n'est pas plus compliqué pour toi, je te recommande plutôt les requêtes préparées, c'est bien moins de soucis à terme. :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 19672 Messages

08 août 2011, 22:34

Pour les erreurs avec la requête préparée, c'est normal : dans la requête, tu indiques par exemple un paramètre « :pass » mais dans l'envoi du prepare() tu indiques « pass » : et le « : » ?
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, 22:41

Toujours les mêmes erreurs avec :
$req = $connexion->prepare('SELECT * FROM user WHERE pseudo = :pseudo AND pass = :pass');
$req->execute(array(':pseudo' => $_POST['pseudo'], ':pass' => $_POST['pass']));

Mammouth du PHP | 19672 Messages

08 août 2011, 22:49

Ben là... :shock: Tu utilises une variable $pass qui n'est jamais initialisée nulle part, il est normal que ça te retourne une erreur.

Quant à ton index id non défini, ça se passe dans ta gestion de session et là, au lieu de faire $_SESSION['id'] = $id quoique là non plus $id n'est définie nulle part, tu initialises $id avec un $_SESSION['id'] non défini au préalable à moins que ce ne soit dans une page précédente ?
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, 23:30

J'ai rajouté :
		 $pass = $_POST['pass'];
		 $pseudo = $_POST['pseudo'];
avant la requette préparée, mais toujours cette meme erreur :
( ! ) Notice: Undefined property: PDOStatement::$pass in C:\wamp\www\Code\pages\connect.php on line 43
Call Stack
# Time Memory Function Location
1 0.0014 381992 {main}( ) ..\connect.php:0

pour le $id, je me suis trompé, je souhaite enregistré un id dans $_SESSION['id'] que j'ai auparavent récupéré avec la requette préparée, mais
$_SESSION['id'] = $req->id;
ne fonctionne pas ... et m'affiche comme message d'erreur :
( ! ) Notice: Undefined index: id in C:\wamp\www\Code\pages\connect.php on line 86
Call Stack
# Time Memory Function Location
1 0.0029 382624 {main}( ) ..\connect.php:0

De plus, il ne veut meme plus reconnaitre mes identifiants et me connecter, il m'affiche "echec de connexion, mauvais pseudo et/ou mauvais mot de passe" :cry:

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

08 août 2011, 23:39

Avec de la requête préparée la question ne se poserait pas, mais ce n'est pas le cas ici ;)
non
Exemple #1 Protection d'une chaîne normale
<?php
$conn = new PDO('sqlite:/home/lynn/music.sql3');

/* Chaîne simple */
$string = 'Nice';
print "Chaîne non échappée : $string\n";
print "Chaîne échappée : " . $conn->quote($string) . "\n";
?>
L'exemple ci-dessus va afficher :
Chaîne non échappée : Nice
Chaîne échappée: 'Nice'
note bien les ' ajoutées

j'ai donc, par acquis de conscience, fait un test perso
<?php
$sgbdCon = [
    'db_type'  => 'mysql',
    'db_host'  => 'localhost',
    'db_user'  => 'root',
    'db_pwd'   => 'yyRu2TKEvyYpzFLK',
    'db_name' => 'test'
];

$pdo = new pdo('mysql:host=localhost;dbname=test', $sgbdCon['db_user'], $sgbdCon['db_pwd']);
/* Chaîne simple */
$_POST = ['pseudo'=>'chaine truc machin','pass'=>"azedscxvfrertr"];
$sql  = 'SELECT * '.
        'FROM user '.
        'WHERE pseudo='.$pdo->quote($_POST['pseudo']).' '.
        'and pass='.$pdo->quote($_POST['pass']).' ';

var_dump($sql);
?>
résultat : string(79) "SELECT * FROM user WHERE pseudo='chaine truc machin' and pass='azedscxvfrertr' "

donc tous va bien j'me goure pas :)

edit : la syntaxe des tableaux est bonne (test alpha php5.4 ^^), ça ne change rien au test

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

08 août 2011, 23:55

moogli, j'avait deja essayé ça avant, je l'ai refait et ça me redit les mêmes erreurs qu'avec la requette prep, :
( ! ) Notice: Undefined property: PDOStatement::$pass in C:\wamp\www\Code\pages\connect.php on line 48
Call Stack
# Time Memory Function Location
1 0.0073 384184 {main}( ) ..\connect.php:0
avec toujours mon $_SESSION['id'] qui ne fonctionne pas (cf mon précédent message) et toujours la connexion qui n'est pas établie, malgrès que j'ai indiqué un bon pseudo et un bon mot de passe.

Donc que ça soit avec cette requette préparée :
$req = $connexion->prepare('SELECT * FROM user WHERE pseudo = :pseudo AND pass = :pass');
$req->execute(array(':pseudo' => $pseudo, ':pass' => $pass));
ou celle-ci :
$sql  = 'SELECT * '.
         'FROM user '.
         'WHERE pseudo='.$connexion->quote($_POST['pseudo']).' '.
         'and pass='.$connexion->quote($_POST['pass']).' ';
$req = $connexion->query($sql); 

les erreurs sont les mêmes ...