[RESOLU] Problème redirection page de profil espace membres

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 21:16

Bonjour,
Je me permet de créer un sujet spécialement pour ce problème que j'avais déjà poster dans un topic précédent il y a 24H mais qui a été classé en tant que résolu alors que je n'avais pas eu de solutions concernant ce problème en particulier. Du coup je m'excuse d'avance si cela est considéré comme du double post! :priere:

Du coup je vous explique:
j'ai un espace membre sur mon site. Lorsque l'on se connecte on est redirigé sur une page de profil. le problème c'est que mes session_start() marche très bien partout sur mes autres onglets mais lorsqu'un utilisateur re-clique sur l'onglet "monprofil.php" il dois de nouveau se re-loger pour accéder à la page de profil... Je ne comprend vraiment pas pourquoi

Code : Tout sélectionner

<?php session_start(); $bdd = new PDO('CONFIDENTIEL'); if(isset($_GET['id']) AND $_GET['id'] > 0) { $getid = intval($_GET['id']); $requser = $bdd->prepare('SELECT * FROM membres WHERE id = ?'); $requser->execute(array($getid)); $userinfo = $requser->fetch(); ?> <html> <head> <link rel="stylesheet" href="Style/inscriptionstyle.css"> <link rel="stylesheet" media="screen and (max-width:1024px)" href="Style/inscriptionstyle.css"> <title>Profil</title> <meta charset="utf-8"> </head> <body> <navbar> <ul> <li><a href="CONFIDENTIEL">Accueil</a></li> <li><a href="CONFIDENTIEL/presentation.php">En savoir plus</a></li> <li><a href="CONFIDENTIEL/formulairedecontact.php">Me contacter</a></li> <li class="current"><a href="CONFIDENTIEL/profil.php">Mon profil</a></li> <li><a href="CONFIDENTIEL/chatbox.php">Chatbox</a></li> <li><a href="CONFIDENTIEL/profilEN.php">English version</a></li> </ul> </navbar> <h1>Profil de <?php echo $userinfo['pseudo']; ?></h1> <div class="profil"> <?php if(!empty($userinfo['avatar'])) { ?> <img src="membres/avatars/<?php echo $userinfo['avatar']; ?> "width=250" /> <?php } ?> <p>Votre Pseudo: <?php echo $userinfo['pseudo']; ?></p> <?php if(isset($_SESSION['id']) AND $userinfo['id'] == $_SESSION['id']) { ?> <p>Votre adresse e-mail est: <?php echo $userinfo['mail']; ?></p> <p><a href="editionprofil.php">Editer mon profil</a></p> <p><a href="deconnexion.php">Se déconnecter</a></p> <p><a href="desinscription.php">Supprimer mon compte</a></p> <?php } ?> </div> </body> <footer> <div class="container"> <a href="CONFIDENTIEL">Mentions légales</a> </div> </footer> </html> <?php } else { header('Location: connexion.php'); } ?>
Je n'ai remarqué que ceci comme différence par rapport à mes autres pages où l'utilisateur est censé rester connecté:

Code : Tout sélectionner

<?php session_start(); if(isset($_SESSION['id'])) { $requser = $bdd->prepare("SELECT * FROM membres WHERE id = ?"); $requser->execute(array($_SESSION['id'])); $user = $requser->fetch(); <?php } else { header('Location: connexion.php'); } ?>
Mais sur la page de profil.php je dois utiliser

Code : Tout sélectionner

if(isset($_GET['id']) AND $_GET['id'] > 0) {
par rapport à ma page login.php... Je suis un peu perdu sur comment utiliser les deux fonctions en même temps sachant que si je met les deux j'ai des erreurs!

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 21:28

Salut, le $_GET c'est pour récupérer des données transmises à la suite de l'url après un ?
Ça c'est éventuellement pour le formulaire de login, qui devrait plutôt être en post pour pas que le mot de passe se balade dans la barre d'adresse.

Pour tester que l'utilisateur est bien authentifié tu dois toujours passer par la session. Ce code la en fait :
<?php
session_start();
if(isset($_SESSION['id'])) {
   $requser = $bdd->prepare("SELECT * FROM membres WHERE id = ?");
   $requser->execute(array($_SESSION['id']));
   $user = $requser->fetch();
// <?php erreur ici
}
else {
    header('Location: connexion.php');
}

Tu devrais même en faire un fichier d'include que tu inclurais dans toutes les pages de l'espace membre.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 21:39

Salut Saian! Tu vas bien ? :)
Je te met le php de ma page de login:

Code : Tout sélectionner

<?php session_start(); $bdd = new PDO('CONFIDENTIEL'); if(isset($_POST['formconnexion'])) { $mailconnect = htmlspecialchars($_POST['mailconnect']); if (isset($_POST['mdpconnect'])) { $mdpconnect= md5($_POST['mdpconnect']); } if(!empty($mailconnect) AND !empty($mdpconnect)) { $requser = $bdd->prepare("SELECT * FROM membres WHERE mail = ? AND motdepasse = ?"); $requser->execute(array($mailconnect, $mdpconnect)); $userexist = $requser->rowCount(); if($userexist == 1) { $userinfo = $requser->fetch(); $_SESSION['id'] = $userinfo['id']; $_SESSION['pseudo'] = $userinfo['pseudo']; $_SESSION['mail'] =$userinfo['mail']; header("Location: profil.php?id=".$_SESSION['id']); } else { $erreur = "Adresse mail ou mot de passe invalides!"; } } else { $erreur = "touts les champs doivent être complétés!"; } } ?>
Il faut savoir que le formulaire html de ma page de login est en POST
mais que je n'ai pas d'infos de connexion qui se balade dans ma barre d'adresse, juste l'id de l'utilisateur dans la base de données ^^
Donc pour faire simple le lien de ma page de profil lorsque je suis connecté ressemble à ça:
https://CONFIDENTIEL/profil.php?id=27

Ah et je rajoute que le code suivant:

Code : Tout sélectionner

<?php } else { header('Location: connexion.php'); } ?>
se trouve tout en page de ma page, en dessous de la balise de fin de l'html (</html>)

Je suis bien au courant que le code a utiliser pour voir si un utilisateur est bien connecté est le suivant:

Code : Tout sélectionner

if(isset($_SESSION['id'])) { $requser = $bdd->prepare("SELECT * FROM membres WHERE id = ?"); $requser->execute(array($_SESSION['id'])); $user = $requser->fetch();
Mais comme j'expliquais plus haut: si je rajoute ces lignes là, en + du

Code : Tout sélectionner

if(isset($_GET['id']) AND $_GET['id'] > 0) { $getid = intval($_GET['id']); $requser = $bdd->prepare('SELECT * FROM membres WHERE id = ?'); $requser->execute(array($getid)); $userinfo = $requser->fetch(); ?>
Alors la page plante et n'affiche que des erreurs ( pareil pour la page de login ^^ )

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 21:48

Donc pour faire simple le lien de ma page de profil lorsque je suis connecté ressemble à ça:
https://CONFIDENTIEL/profil.php?id=27

C'est ici le problème. Tu n'as pas besoin de mettre l'id dans l'url car tu l'as enregistré dans la session, pas besoin de faire du get sur la page de profil.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 21:50

Donc j'ai juste à retirer le code suivant de ma page de profil ?

Code : Tout sélectionner

if(isset($_GET['id']) AND $_GET['id'] > 0) { $getid = intval($_GET['id']); $requser = $bdd->prepare('SELECT * FROM membres WHERE id = ?'); $requser->execute(array($getid)); $userinfo = $requser->fetch(); ?>

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 21:53

J'ai pas regardé tout en détail mais oui ce code ne sert à rien, tu peux enlever l'id de l'adresse et mettre le code avec la session.

Attention aussi aux header('Location: *'). Si tu ne mets pas un exit juste après, le fichier s'exécute jusqu'au bout et ça peut résulter dans certains cas en des comportements inattendus si le code est mal structuré (par exemple si ça passe plus bas sur un unset($_SESSION['id'])).
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 22:01

...
Mais comme j'expliquais plus haut: si je rajoute ces lignes là, en + du
...
Alors la page plante et n'affiche que des erreurs
En fait je note aussi en regardant un peu plus en détail ton code :
if(isset($_SESSION['id'])) {
   $requser = $bdd->prepare("SELECT * FROM membres WHERE id = ?");
   $requser->execute(array($_SESSION['id']));
   $user = $requser->fetch();
// ...

if(isset($_GET['id']) AND $_GET['id'] > 0) {
   $getid = intval($_GET['id']);
   $requser = $bdd->prepare('SELECT * FROM membres WHERE id = ?');
   $requser->execute(array($getid));
   $userinfo = $requser->fetch();
// ...
Sur la partie session la variable c'est $user et sur l'autre $userinfo. Donc forcément ça peut résulter en erreurs si tu n'adaptes pas le nom de la variable comme il faut par rapport au code qui suit.

PS : les messages d'erreurs faut les lire, ça permet souvent de comprendre le problème. ^^
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 22:24

Effectivement, en vérifiant mes variables et en faisant comme tu as dis, j'ai accès à mon profil une fois connecté et la session est persistante si je change d'onglet ! Du coup je pense que ça marche ! :)

Par contre, j'ai toujours ma barre d'url qui lorsque je me connecte, continue de m'afficher un id + un #envoi (exemple: CONFIDENTIEL/profil.php?id=27#envoi ) mais lorsque je clique ailleurs et que je reviens sur mon profil, l'url devient /profil.php. Il n'y aurais pas un moyen pour que l'url ressemble toujours à la dernière forme ? C'est à dire qu'à la connexion il m'envoie sur /profil.php et qu'il n'affiche plus l'id utilisateur de la base de donnée et le #envoi du form ? :p

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 22:27

Ben oui tu changes le header location du login.
//header("Location: profil.php?id=".$_SESSION['id']);
header("Location: profil.php");
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 22:30

Oui ça je l'ai compris et fais juste avant que tu ne poste ton message du dessus haha :p
Mais j'ai toujours un #envoi du formulaire dans l'url :x

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 22:31

Faudrait voir le code du formulaire pour dire.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 22:34

Code : Tout sélectionner

<?php session_start(); $bdd = new PDO('CONFIDENTIEL'); if(isset($_POST['formconnexion'])) { $mailconnect = htmlspecialchars($_POST['mailconnect']); if (isset($_POST['mdpconnect'])) { $mdpconnect= md5($_POST['mdpconnect']); } if(!empty($mailconnect) AND !empty($mdpconnect)) { $requser = $bdd->prepare("SELECT * FROM membres WHERE mail = ? AND motdepasse = ?"); $requser->execute(array($mailconnect, $mdpconnect)); $userexist = $requser->rowCount(); if($userexist == 1) { $userinfo = $requser->fetch(); $_SESSION['id'] = $userinfo['id']; $_SESSION['pseudo'] = $userinfo['pseudo']; $_SESSION['mail'] =$userinfo['mail']; header("Location: profil.php"); } else { $erreur = "Adresse mail ou mot de passe invalides!"; } } else { $erreur = "touts les champs doivent être complétés!"; } } ?> <html> <head> <link rel="stylesheet" href="Style/inscriptionstyle.css"> <link rel="stylesheet" media="screen and (max-width:1024px)" href="Style/inscriptionstyle.css"> <title>Connexion</title> <meta charset="utf-8"> </head> <body> <navbar> <ul> <li><a href="CONFIDENTIEL">Accueil</a></li> <li><a href="CONFIDENTIEL">En savoir plus</a></li> <li><a href="CONFIDENTIEL">Me contacter</a></li> <li class="current"><a href="CONFIDENTIEL">Connexion</a></li> <li><a href="CONFIDENTIEL">Chatbox</a></li> <li><a href="CONFIDENTIEL">English version</a></li> </ul> </navbar> <div class="main"> <h1>Se connecter</h1> <form method="POST" action="#envoi"> <input type="email" name="mailconnect" placeholder="Votre adresse mail" /> <input type="password" name="mdpconnect" placeholder="Mot de passe" /> <input type="submit" name="formconnexion" value="Connexion" /> </form> <div class="error"> <?php if(isset($erreur)) { echo ''.$erreur.""; } ?> </div> </div> <div class="register"> <p>Vous n'avez pas encore de compte?</p><a href="inscription.php">Creer un compte</a> </div> </body> <footer> <div class="container"> <a href="CONFIDENTIEL/conditions.php">Mentions légales</a> </div> </footer> </html>

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 22:39

C'est le action du formulaire, mets action="" ça devrait être mieux.

Ah oui et ajoute un exit(); après le header location. C'est mieux de prendre l'habitude de le faire, vu que tu veux rediriger l'utilisateur sur une autre page, ça sert à rien que le serveur exécute le script jusqu'au bout.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 22:59

Impeccable! Ca marche parfaitement maintenant ! :)
Et si j'ai bien compris le exit(); se met après un header location, permet d'éviter à une page de charger du script/code inutile et je peux donc en mettre après chaque header sur toutes mes pages où il y en a ? :)

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 23:05

Après chaque header location, oui. ;)
Développeur web depuis + de 20 ans