Problème avec les conditions

Le problème exposé dans ce sujet a été résolu.

Bonsoir, Alors voilà, après avoir bosser pas mal sur un système de connexion/inscription pour mon prochains site web, je me retrouve dans une impasse pour le système de connexion. J'ai pour l'instant ce code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
$bdd = new PDO('mysql:host=localhost;dbname=****', 'root', '');
$req1 = $bdd->query('SELECT * FROM user');

if(isset($_POST['submit'])) {
if(isset($_POST['pseudo']) AND !empty($_POST['pseudo']) AND isset($_POST['mdp']) AND !empty($_POST['mdp']))
{
    $pseudo = mysql_escape_string($_POST['pseudo']);
    $mdp = mysql_escape_string(md5($_POST['mdp'])); 

$req1 = mysql_query('SELECT * FROM user WHERE pseudo = "'.$pseudo.'"');
$info_membre = mysql_fetch_array($req1);

if(isset($info_membre['pseudo'])) {


if($mdp == $info_membre['mdp'])
{
$_SESSION['pseudo'] == $pseudo;
}
else
{
echo 'mot de passe incorrect';
}

}
else
{
    echo 'le pseudo nexiste pas';
}
}
else
{
    echo 'Tous les champs doivent être remplie.';
}
}

?>

<h1>Créer un compte</h1>
<hr />
<form action="" method="post">
<input type="text" name="pseudo" value="<?php if(isset($_POST['pseudo'])) { echo $_POST['pseudo']; } ?>" />
<input type="text" name="mdp" />
<input type="submit" value="Connexion" name="submit" />
</form>

Seul problème c'est que j'ai toujours le message le pseudo n'existe pas alors que celui ci ce trouve bien dans la bdd :/

Ben, le problème, c'est que tu ouvres une connexion avec PDO.

1
2
3
<?php
$bdd = new PDO('mysql:host=localhost;dbname=****', 'root', '');
?>

Puis tu fais ton appel à la BDD et tout le travail subséquent avec les fonctions mysql_* (dépréciées, au passage, elles ne fonctionneront bientôt plus) au lieu des fonctions PDO.

1
2
3
4
<?php
$req1 = mysql_query('SELECT * FROM user WHERE pseudo = "'.$pseudo.'"');
$info_membre = mysql_fetch_array($req1);
?>

Comme tu n'as pas fait de mysql_connect(), eh bien mysql_query n'a aucune connexion ouverte vers une BDD et cherche ton pseudo dans… rien. Forcément, ça ne peut pas marcher. Il faut que tu utilises PDO tout du long.

PS : indente mieux ton code, c'est illisible en l'état. Ou mieux, puisque les conditions imbriquées servent essentiellement à vérifier que tu ne travailles pas avec des variables vides, utilise plutôt un système d'exceptions (throw, catch), ça te permettra de désimbriquer les différentes sections de ton code.

+1 -0

Salut !

Quelques points que j’aimerais relever ici :

  1. il n’y a pas besoin de faire les deux tests isset() et !empty(), le dernier uniquement suffit
  2. si ce n’est pas un souci au copier-coller, revois ton indentation, tu risques de mieux t’y retrouver quand tu reliras ton code (et nous pour mieux en voir l’organisation aussi)  ;)
  3. il me semble que si l’utilisateur soumet le formulaire en appuyant sur ENTER, $_POST['submit'] n’existera pas, donc tu ne pourras pas faire la validation
  4. plutôt que de récupérer toutes les données d’un utilisateur, je te proposerais de compter le nombre de résultats avec une requête SELECT count(`id`) AS `nombre` FROM user WHERE pseudo = [le pseudo]
  5. les chaînes de caractères, pour MySQL, sont délimitées par des guillemets simples ', là tu utilises des guillemets doubles. Ça peut passer, mais c’est pas garanti que ça le fasse tout le temps
  6. à quoi sert la requête de la ligne 3 ?
  7. pourquoi lancer la connexion avec PDO puis utiliser les fonctions mysql_*() par la suite ? Les deux méthodes sont incompatibles, garde PDO uniquement si tu as la possibilité. Comme le dit le message ci-dessus, les fonctions mysql_*() ne sont plus recommandées et vont gentiment disparaître
+0 -0

Ben, le problème, c'est que tu ouvres une connexion avec PDO.

1
2
3
<?php
$bdd = new PDO('mysql:host=localhost;dbname=****', 'root', '');
?>

Puis tu fais ton appel à la BDD et tout le travail subséquent avec les fonctions mysql_* (dépréciées, au passage, elles ne fonctionneront bientôt plus) au lieu des fonctions PDO.

1
2
3
4
<?php
$req1 = mysql_query('SELECT * FROM user WHERE pseudo = "'.$pseudo.'"');
$info_membre = mysql_fetch_array($req1);
?>

Comme tu n'as pas fait de mysql_connect(), eh bien mysql_query n'a aucune connexion ouverte vers une BDD et cherche ton pseudo dans… rien. Forcément, ça ne peut pas marcher. Il faut que tu utilises PDO tout du long.

PS : indente mieux ton code, c'est illisible en l'état. Ou mieux, puisque les conditions imbriquées servent essentiellement à vérifier que tu ne travailles pas avec des variables vides, utilise plutôt un système d'exceptions (throw, catch), ça te permettra de désimbriquer les différentes sections de ton code.

Dominus Carnufex

D'accord, merci à toi, je vais revoir le PDO alors ^^

Salut !

Quelques points que j'aimerais relever ici :

  1. il n'y a pas besoin de faire les deux tests isset() et !empty(), le dernier uniquement suffit
  2. si ce n'est pas un souci au copier-coller, revois ton indentation, tu risques de mieux t'y retrouver quand tu reliras ton code (et nous pour mieux en voir l'organisaion aussi)  ;)
  3. il me semble que si l'utilisateur soumet le formulaire en appuyant sur ENTER, $_POST['submit'] n'existera pas, donc tu ne pourras pas faire la validation
  4. plutôt que de récupérer toutes les données d'un utilisateur, je te proposerais de compter le nombre de résultats avec une requête SELECT count(`id`) AS `nombre` FROM user WHERE pseudo = [le pseudo]
  5. les chaînes de caractères, pour MySQL, sont délimitées par des guillemets simples ', là tu utilises des guillemets doubles. Ça peut passer, mais c'est pas garanti que ça le fasse tout le temps
  6. à quoi sert la requête de la ligne 3 ?
  7. pourquoi lancer la connexion avec PDO puis utiliser les fonctions mysql_*() par la suite ? Les deux méthodes sont incompatibles, garde PDO uniquement si tu as la possibilité. Comme le dit le message ci-dessus, les fonctions mysql_*() ne sont plus recommandées et vont gentiment disparaître

Ymox

Je prends en compte, merci à toi aussi.

J'adhère totalement aux commentaires de mes vdd.

Même si c'est un peu HS j'ajouterai juste qu'utiliser md5() seul pour hacher tes mots de passe c'est pas très sécurisé. Depuis sa v5.5.0 PHP propose une extension pour gérer le hachage les mot de passe.

luuka

Je ne savais pas, je vais voir ça, merci.

Résolu donc, je vous remercie énormément.

Soit dit en passant :

  1. il me semble que si l'utilisateur soumet le formulaire en appuyant sur ENTER, $_POST['submit'] n'existera pas, donc tu ne pourras pas faire la validation

Ymox

Ceci n'est pas vrai : en appuyant sur ENTER, le navigateur envoie l'ensemble du formulaire. Si l'un de ses champs s'appelle submit alors $_POST['submit'] existera bel et bien. ;)

Mais c'est vrai qu'on peut se passer de ce genre de vérification : autant regarder si le contenu du formulaire qui nous intéresse vraiment existe pour ensuite le traiter.

en appuyant sur ENTER, le navigateur envoie l'ensemble du formulaire. Si l'un de ses champs s'appelle submit alors $_POST['submit'] existera bel et bien. ;)

Mais c'est vrai qu'on peut se passer de ce genre de vérification : autant regarder si le contenu du formulaire qui nous intéresse vraiment existe pour ensuite le traiter.

viki53

Ça fait un bail (c'est le cas de le dire) que je n'ai pas revérifié ça, mais je suis sûr qu'un temps Firefox n'envoyait justement pas ce genre de valeurs. Comme j'avais un token de vérification CSRF dans le bouton, ben le formulaire était invalide quand je le soumettais avec ENTER. Je testais en cliquant, ça fonctionnait…

Edit

Ah, mais peut-être que justement, ce n'était pas un <input>, mais un <button>, dans ce cas là, mea cupla

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte