Problème de connexion

Résolu/Fermé
Utilisateur anonyme - 14 mai 2017 à 21:36
 Utilisateur anonyme - 16 mai 2017 à 18:10
Bonsoir,

J'ai fais un portfolio en PHP. Dans ce portfolio j'utilise une base de données car j'ai un formulaire de connexion et un formulaire de contact. Le formulaire de contact marche bien mais le formulaire de connexion marche partiellement.

En effet, quand je me connecte avec mon login et mon mot de passe ça se connecte. Mais quand je navigue sur les autres pages, ça se déconnecte automatiquement. Et mon but c'est que ça reste connecté pendant toute la navigation de page en page.

Pouvez-vous m'aider ?

Voici le script PHP du formulaire de connexion appelé _debut.php qui est insérer sur toutes les pages du portfolio avec la méthode session_start :
<?php
session_start ();
// affichage des erreurs php
 error_reporting(E_ALL);
// fonction PHP permettant de crée une session ou restaure celle trouvée sur le serveur, via l'identifiant de session passé dans une requête GET, POST ou par un cookie
include_once('controleur/authentification.php');
// include_once'controleur/deconnexion.php';
include_once 'analyticstracking.php';
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="#">

<title>Portfolio de Honoré</title>

<!-- Bootstrap core CSS -->
<link href="bootstrap/css/bootstrap.css" rel="stylesheet">
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="bootstrap/css/bootstrap-responsive.css" rel="stylesheet">
<link href="bootstrap/css/bootstrap-responsive.min.css" rel="stylesheet">

<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<link href="../../assets/css/ie10-viewport-bug-workaround.css"
	rel="stylesheet">

<!-- Custom styles for this template -->
<link href="jumbotron.css" rel="stylesheet">

<!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
<!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
<script src="../../assets/js/ie-emulation-modes-warning.js"></script>

<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
          <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
          <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
</head>
<link href="bootstrap/css/style.css" rel="stylesheet">
<body>
	<nav class="navbar-fixed-top navbar-inverse">

		<div class="container test">
			<div class="navbar-header">
				<button type="button" class="navbar-toggle collapsed"
					data-toggle="collapse" data-target="#navbar" aria-expanded="false"
					aria-controls="navbar">
					<span class="sr-only">Toggle navigation</span> <span
						class="icon-bar"></span> <span class="icon-bar"></span> <span
						class="icon-bar"></span>
				</button>
				<a class="navbar-brand"></a>
			</div>
			<div id="navbar" class="collapse navbar-collapse">
				<ul class="nav navbar-nav">
					<li><a href="index.php" rel="nofollow noopener noreferrer" target="_blank"><span class="glyphicon glyphicon-home"> </span>
							Accueil</a></li>
					<li><a href="cv.php" rel="nofollow noopener noreferrer" target="_blank"><span class="glyphicon glyphicon-briefcase"> </span>
							Mon CV</a></li>
					<li><a href="projets.php" rel="nofollow noopener noreferrer" target="_blank"><span
							class="glyphicon glyphicon-folder-open"></span> Mes projets
							informatiques</a></li>
					<li><a href="contact.php" rel="nofollow noopener noreferrer" target="_blank"><span
							class="glyphicon glyphicon-envelope"></span> Contact</a></li>
                        <?php if (isset($_SESSION['user'])): ?>
                            <li><a href="profil.php" rel="nofollow noopener noreferrer" target="_blank"><span
							class="glyphicon glyphicon-lock"></span> Mon profil</a></li>

                        <?php endif; ?>
                    </ul>
                    <?php if (!isset($_SESSION['user'])): ?>
                        <form class="navbar-form navbar-right"
					method="POST">
					<div class="form-group">
						<input type="text" name="user" placeholder="Nom d'utilisateur"
							class="form-control">
					</div>
					<div class="form-group">
						<input type="password" name="mdp" placeholder="Mot de passe"
							class="form-control">
					</div>
					<button type="submit" name="connecter" class="btn btn-success">Se
						connecter</button>
				</form>
                    <?php else: ?>
                        <div class="nav navbar-nav pull-right">
					<span class="glyphicon glyphicon-user white xsTabulation"
						aria-hidden="true"> </span> <a href="utilisateur.php" rel="nofollow noopener noreferrer" target="_blank"><span
						class="text-center white xsTabulation"><?php echo "Bienvenue  " . $_SESSION['user']; ?></a>
					</span> <span> <a href="<?php echo $_SERVER['PHP_SELF']; ?>?logout"
						class="white">
							<button type="submit" name="deconnecter" class="btn btn-success"
								span class="glyphicon glyphicon-log-out " aria-hidden="true"
								title="log-out" action=<?php unset($_SESSION['user']);?>>Se déconnecter</button></span> </a> </span>
				</div>
                    <?php endif; ?>
                </div>
			<!-- /.nav-collapse -->
		</div>
		<!-- /.container -->

	</nav>
	<!-- /.navbar -->


Voici le script PHP pour me connecter à ma base de données par l'intermédiaire de PDO. Le fichier s'appelle accesbase.php issu du répertoire modele :

try {
	$pdo = new PDO ( 'mysql:host=' . HOTE . ';dbname=' . BDNOM, UTILISATEUR, MDP );
} catch ( PDOException $e ) {
	die ( "Erreur ! :" . $e->getMessage () );
}


Et voici le script PHP de connexion implémenté pour mon formulaire. Le fichier s'appelle authentification.php. Il est dans le répertoire controleur :

<?php
include_once ('modele/accesbase.php');
if (isset ( $_POST ['connecter'] )) {
	if (isset ( $_POST ['user'] ) && isset ( $_POST ['mdp'] )) {
		$user = $_POST ['user'];
		$mdp = $_POST ['mdp'];
		$sql = "SELECT * FROM compte WHERE user=:user AND mdp=:mdp ";
		$query = $pdo->prepare ( $sql );
		// Lie un nom de variable avec un paramètre
		$query->bindParam ( ':user', $user );
		$query->bindParam ( ':mdp', $mdp );
		$query->execute ();
		$_SESSION['user'] = $user;
		$_SESSION['mdp'] = $mdp;
	} else
		return 0;
} else
	return false;


J'attends vos retours.

2 réponses

Felice_ Messages postés 265 Date d'inscription mardi 25 avril 2017 Statut Membre Dernière intervention 20 juillet 2017 11
Modifié le 15 mai 2017 à 10:08
Visiblement, il y a trois cas :
— Les sessions ne sont pas sauvegardées
— Les sessions ne sont pas lues
— Les sessions sont détruites après la première fois

Alors en premier temps je testerai déjà de fermer les blocs des « else » correctement de tes conditions et je fermerai l'écriture une fois plus nécessaire :

<?php

if (isset ( $_POST ['connecter'] )) {
    if (isset ( $_POST ['user'] ) && isset ( $_POST ['mdp'] )) {
        $user = $_POST ['user'];
        $mdp = $_POST ['mdp'];
        $sql = "SELECT * FROM compte WHERE user=:user AND mdp=:mdp ";
        $query = $pdo->prepare ( $sql );
        // Lie un nom de variable avec un paramètre
        $query->bindParam ( ':user', $user );
        $query->bindParam ( ':mdp', $mdp );
        $query->execute ();
        $_SESSION['user'] = $user;
        $_SESSION['mdp'] = $mdp;
        session_write_close ();
    } else {
        return 0;
    }
} else {
    return false;
}

?>
0
Utilisateur anonyme
15 mai 2017 à 17:22
Merci de m'avoir répondu mais j'ai essayé ce que tu m'as demandé mais cela ne marche pas.
0
Utilisateur anonyme
15 mai 2017 à 17:26
Non finalement je me suis emballé trop vite. Ca ne marche toujours pas.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
Modifié le 15 mai 2017 à 18:04
Bonjour,

Premièrement .. active la gestion des erreurs PDO https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs et place tes requêtes dans des blocs TRY/CATCH (comme dans l'exemple du lien )

Puis fais un
print_r($_SESSION);
au début de tes pages.

Et enfin.. assures toi que les sessions sont bien démarrées sur toutes tes pages ... y compris dans ta page authentification.php



Cordialement, 
Jordane                                                                 
0
Utilisateur anonyme
15 mai 2017 à 18:37
Bon j'ai géré les erreurs PDO en rajoutant les lignes dans mon fichier accesbase.php :
	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
	$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);


Ensuite j'ai isolé ma requêtes dans un bloc try et catch dans mon fichier authentification.php :

<?php
include_once ('modele/accesbase.php');
if (isset ( $_POST ["connecter"] )) {
	if (isset ( $_POST ["user"] ) && isset ( $_POST ["mdp"] )) {
		$user = $_POST ["user"];
		$mdp = $_POST ["mdp"];
		$sql = "SELECT * FROM compte WHERE user=:user AND mdp=:mdp ";
		$datas = array (
				':user' => $user,
				':mdp' => $mdp 
		);
		try {
			$query = $pdo->prepare ( $sql );
			// Lie un nom de variable avec un paramètre
			$query->bindParam ( ':user', $user );
			$query->bindParam ( ':mdp', $mdp );
			$query->execute ( $datas );
			$_SESSION ["user"] = $user;
			$_SESSION ["mdp"] = $mdp;
			// } else
			// return 0;
		} catch ( Exception $e ) {
			// en cas d'erreur :
			echo " Erreur ! " . $e->getMessage ();
			echo " Les datas : ";
			print_r ( $datas );
		}
	}
}
// } else
// return false;
?>


Ensuite dans mon fichier index.php, j'ai rajouté le print_r($_SESSION) :
print_r($_SESSION);


Et il m'indique :
Array ( [mdp] => honore )

Et le user n'est pas pris en compte.

Pour le session_start, je l'ai indiqué dans mon fichier _debut.php qui est inclus sur toute les pages.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > Utilisateur anonyme
15 mai 2017 à 18:43
Tu peux faire le print session dans ton fichier authentification.php ?

Et.. n'aurais tu pas, quelquepart un code du genre unset($_SESSION['user']) ?

et au cas où .. si tu renommes ta variable"user" en autre chose ... est-ce qu'il garde la variable en session ou pas ? (sachant que tu devrais mettre l' ID du user plutôt que son login..... )
ID que tu récupères lorsque tu vérifies que l'utilisateur existe ...


Ensuite, pour info, tu utilises soit le bindParam .. soit l'array de DATA dans le execute ....
0
Utilisateur anonyme
15 mai 2017 à 20:46
Pour le unset($_SESSION['user']) , j'en avais un pour mon bouton de déconnexion. Je l'ai enlevé et remplacer par la fonction session_unset().

Alors j'ai renommé ma variable $user en $utilisateur et visiblement il ne garde pas la session. Après pour l'ID le problème c'est que dans ma table compte il y a que deux colonnes, la colonne user et la colonne mdp. Et pas de colonne ID.

Effectivement pour le bindParam et comme mentionné dans ton lien, j'ai enlevé le tableau data.

Après tout ces changements, pas de miracle. Et le print_r($_SESSION) sur le authentification.php ne s'affiche pas.
0
Utilisateur anonyme
16 mai 2017 à 17:46
Ca y est j'ai trouvé le bug. En fait, c'est la méthode session_unset() que j'avais mis sur mon bouton déconnecter qui faisait déconnecter tous seul en naviguant de pages à pages.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > Utilisateur anonyme
16 mai 2017 à 18:09
... c'est toujours la faute du unset caché :-)

Pense à mettre la discussion en résolu.
Bonne soirée.
0