Problème sur la création d'une page de connextion

a marqué ce sujet comme résolu.

Comme ça ? : (isset($_POST['pseudo1']) AND $_POST['pseudo1'] == "pseudo")

As-tu essayé ton propre code ? A moins de s'appeler pseudo, ton site n'est pas prêt d'avoir la moindre activité … Tu veux que la variable existe simplement, elle doit donc pouvoir avoir un contenu quelconque (cela dit ayant POST pour origine ce sera forcément une chaîne). De toute façon, tu vérifies après que ce pseudo qu'on t'a donné correspond à quelqu'un ou non. Pourquoi le tester pour le forcer à la valeur "pseudo" ? isset n'est-il pas suffisant pour ne tester que son existence ? (à la rigueur !empty mais pas plus)

+0 -0

Je pense que tu as surtout un problème de conception. As-tu pris le temps de réfléchir à ce que tu voulais et comment l'obtenir ?

J'ai effectivement écrit ce que je voulais faire sur papier (sous la forme d'un schémas) La ou je bloque, c'est de vérifier si le mot de passe correspond bien au pseudo. La ou j'ai le pus de difficultés c'est au niveau des interactions entre le site et la base de donnée.

1
Comme ça ? : (isset($_POST['pseudo1']) AND $_POST['pseudo1'] == "pseudo")

Oui, effectivement c'est un peut bête ce que j'ai fait, ça donnerais php (isset($_POST['pseudo1'] AND $_POST['pseudo1'])) ou je suis encore sur une fausse piste ?

+0 -0

Euh si c'est vraiment (isset($_POST['pseudo1'] AND $_POST['pseudo1'])) que tu as écrit, tu n'aurais pas PHP qui râle parce que tu passes une valeur au lieu d'une variable à isset ?

T'es conscient, ici, de tester l'existence d'un booléen (vrai si $_POST['pseudo1'] existe et n'est pas une chaîne vide ni '0') ce qui n'a aucun sens ?

Par contre, en corrigeant la parenthèse : (isset($_POST['pseudo1']) && $_POST['pseudo1']) oui et ça revient à réécrire empty ((!empty($_POST['pseudo1'])) fera la même chose en plus court).

Là où je bloque, c'est pour vérifier si le mot de passe correspond bien au pseudo.

C'est pourtant juste une condition à ajouter au code que je t'ai donné (dont l'intégration dépend si on veut distinguer les différents cas) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$reponse = $bdd->prepare('SELECT * FROM membres WHERE pseudo = ?');
$reponse->execute([$_POST['pseudo1']]);
// s'il existe un utilisateur sous ce nom ET que son mot de passe (son hash) correspond
if (($user = $reponse->fetch(/*PDO::FETCH_ASSOC*/)) && $user['pass'] == sha1('gz'.$_POST['pass2'])) {
//if (($user = $reponse->fetch(/*PDO::FETCH_ASSOC*/)) && password_verify($_POST['pass2'], $user['pass'])) {
    // ok, l'utilisateur a montré patte blanche
} else {
   // personne sous ce couple login/mdp
}
+0 -0

Ah ! j'avais mal compris …

Le code fonctionne, je serais tenter de le re-poster mais je suis face à un problème; Les accents !

Arf, mais quel bazars !, Je vous fais un petit schéma car je pence ne pas être suffisamment claire si je tente de vous expliquer ça. Image utilisateur

Je ne comprend absolument pas pourquoi j'ai ça ! de plus, comment je pourrais faire pour rentrer un accent dans une base de donné ?

+0 -0

Il nous manque des infos : d'où sortent les 2 "Sébastien".

Mais pour commencer est-ce que tous tes scripts sont encodés avec un seul et même jeu de caractères et non un mélange UTF-8 et ANSI/Windows-1252/ISO-8859-1(5) ?

Sur ta connexion ($bdd = new PDO('mysql:host=localhost;dbname=tests', 'root', '');), tu ne spécifies aucun jeu de caractère or on devrait y trouver un paramètre charset dans le DSN.

"Bonjour, mon nom est Sébastien" est codé en dur dans index.php qui est encodé en UTF-8 ? "Bonjour Sébastien" est codé en dur dans pied_page.php qui est encodé en ISO-8859-1 ou semblable ou alors provient de la bdd qui renvoie du latin1 par défaut ?

+0 -0

En faite, les "Sébastien" était donnés comme exemple. Pour le moment, mon problème viens simplement d'une phrase avec des accents écrit en dure.

Mais pour commencer est-ce que tous tes scripts sont encodés avec un seul et même jeu de caractères et non un mélange UTF-8 et ANSI/Windows-1252/ISO-8859-1(5) ?

Oui

Sur ta connexion ```php ($bdd = new PDO('mysql:host=localhost;dbname=tests', 'root', '');)

1
2
3
4
ce paramètre ? :
```php
$bdd = new PDO('mysql:host=localhost;dbname=tests', 'root', ''
$dbh->exec("set names utf8");

"Bonjour, mon nom est Sébastien" est codé en dur dans index.php qui est encodé en UTF-8 ? "Bonjour Sébastien" est codé en dur dans pied_page.php qui est encodé en ISO-8859-1 ou semblable ou alors provient de la bdd qui renvoie du latin1 par défaut ?

Dans mon 1er exemple, il sont tout les deux encodé en UTF8, dans le second, tout deux en ISO. Voici mon code :

La page dite "index" dans mon exemple :

 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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=tests', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}


$reponse = $bdd->prepare('SELECT * FROM membres WHERE pseudo = ?');
$reponse->execute([$_POST['pseudo1']]);
//si un utilisateur est sous ce nom et que son mdp correspond
if (($user = $reponse->fetch()) && $user['pass'] == sha1('gz'.$_POST['pass2']))
  {
      ?>      
      <article class=contenu>
      <!DOCTYPE html">
      <html lang="fr">
      <head>
      <title>connextion</title>
      <link href="inscription.css" rel="stylesheet" type="texte/css" />
      <meta http-equiv="Content-Type" content="text/html; charset=ISO 8859-15" >
      </head>
      <body class=connextion_return01>
      <?php include("menu.php"); ?>
      </br></br>
      Nice ! tu est connecté sous le nom de <?php echo ''.$_POST['pseudo1'].''; ?>
      </br></br>
      <?php include("Pied_de_page.php"); ?>
      </body>
      </html>
      </article>
      <?php
  }
else
  {
      ?>
      <article class=contenu>
      <!DOCTYPE html">
      <html lang="fr">
      <meta http-equiv="Content-Type" content="text/html; charset=ISO 8859-15" />
      <head>
      <title>connextion</title>
      <link href="inscription.css" rel="stylesheet" type="texte/css" />
      </head>
      <body class=connextion_return01>
      <?php include("menu.php"); ?>
      </br></br>
      Oups ! login ou mdp incorrecte :/
      </br></br>
      <?php include("Pied_de_page.php"); ?>
      </body>
      </html>
      </article>
      <?php
  }
?>



<?php // ne pas prendre en compt cette partie, elle me servira pour les sessions.

      // on la démarre :)
//        session_start ();
      // on enregistre les paramètres de notre visiteur comme variables de session ($login et $pwd) (notez bien que l'on utilise pas le $ pour enregistrer ces variables)
//        $_SESSION['login'] = $_POST['login'];
//        $_SESSION['pwd'] = $_POST['pwd'];

      // on redirige notre visiteur vers une page de notre section membre
//        header ('location: page_membre.php');
      
?>

La page dite "Pied_page" dans mon exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<footer class=le_pied_de_page>
<!DOCTYPE html>
<html lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=ISO 8859-15" />
<link href="Pied_de_page.css" rel="stylesheet" type="texte/css" />
<head>
<title>Pied de page</title>
</head>
<body class=Pied_de_page>
<p>Copyright Sébastien, tous droits réservés</p>
</body>
</html>
</footer>

+0 -0

Il n'est pas écrit en dur s'il provient de la méthode POST.

Donc il faut voir le jeu de caractère de ce formulaire aussi. Et, j'ai oublié de dire, que la meta, est secondaire, il y a aussi l'entête HTTP Content-Type à prendre en compte. N'en explicitant pas, c'est certainement PHP qui la gère via le default_charset donc devrait avoir UTF-8 pour valoir, ce qui ne correspond pas à la meta que tu donnes ci-dessus.

$dbh->exec("set names utf8");

C'est quoi cette ligne ? Ton new PDO prend fin où (ie il manque la )) ? Si ta connexion s'appelle $bdd, d'où $dbh ? De plus, il ne faut JAMAIS exécuter directement un SET NAMES sauf si vraiment on n'a pas le choix, ça peut théoriquement valoir des injections, c'est pourquoi il faut passer par le paramètre charset prévu depuis PHP 5.3.6 du DSN. Si tu lis la doc du constructeur de PDO, tu verrais que ça correspond à son premier paramètre et que c'est un paramètre comme le sont host, dbname & co.

+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