[RESOLU] Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

Re: Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par ynx » 17 août 2022, 16:32

La variable $_POST["submit"] ne pourra pas existé dans ton traitement PHP puisqu'il n'y a pas de formulaire avec method="POST".

Le bouton submit ne semble pas adapté puisque tu n'as pas de formulaire ni de données à transmettre, utilise plutôt des liens.

Les pages dont l'accès est restreint (direction_des_opérations.php) ne devraient pas refaire toutes les redirections vers les autres pages. Dans ces pages, tu dois rediriger l'utilisateur connecté uniquement si celui-ci n'est pas autorisé à accéder à la page.

Re: Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par Seaotter » 17 août 2022, 14:34

Ouhla désolée pour la répétition des messages le site a buggé. (##edit modération : ménage effectué ;-) )
J'ai donc fait cela sur la page Direction des opérations et pareil rien ne se passe et aucune erreur :

//page direction_des_opérations

<?php
  session_start();
  require_once 'config.php';

	if(!isset($_SESSION['user'])){
			header('Location:index.php');
			die();
	}

$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();



if ($data['direction'] === 'Direction des Opérations' && ($_POST["submit"])) {
header('Location: direction_des_operations.php');
die();
}

if ($data['direction'] === 'Direction Juridique et Ressources Humaines'  && ($_POST["submit"])) {
header('Location: direction_juridique_et_ressources_humaines.php');
die();
}

if ($data['direction'] === 'Direction Technique et Financière'  && ($_POST["submit"])) {
header('Location: direction_technique_et_financiere.php');
die();
}

if ($data['direction'] === 'Direction Générale'  && ($_POST["submit"])) {
header('Location: direction_generale.php');
die();
}


?>



<!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">


         

        </head>
<body>


	<button onclick="window.location.href = 'formulaire.php';">Compléter les informations du formulaire d'archivage </button>
	<input type="submit" name="suiviDestruction" id = "suiviDestruction" value="Indiquer la date de destruction réelle"  style="background-color:#white" style="color:white; font-weight:bold" onclick>

</body>
</html>

Re: Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par Seaotter » 17 août 2022, 14:14

Bonjour et merci

Le problème c'est que ce soit en faisant votre solution ou la mienne (en ajoutant un bouton "accéder à mon espace" qui redirige vers la page de la direction pour laquelle on est rattaché) rien ne se passe, on reste bloqué sur la landing page sans aucun message d'erreur donc je suis complètement bloquée.

Re: Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par ynx » 17 août 2022, 12:03

La page landing.php bascule vers la page index.php puisque à la fin code proposé, j'ai ajouté une redirection sans condition vers la page index.php (// si $data['direction'] ne correspond pas aux valeurs testées...)
Il suffit de supprimer cette redirection pour afficher la page.

Tu n'as pas besoin de duppliquer le code pour faire la requête sql, tu peux récupérer les données de l'utilisateur connecté une seule fois.

Pour que les redirections PHP avec la header() fonctionnent correctement et pour éviter l'erreur "headers already sent", il ne faut effectivement aucun affichage ou sortie avant l'utilisation de la fonction header().
La solution recommandée est bien de déplacer tout le traitement php avant l'affichage html.
Egalement, il ne faut pas utiliser echo ou tout autre affichage avant les redirection. Ton message d'erreur pour 'current_password' ou 'success_password' doit donc être affiché dans ton document html.
Evite également de fermer la balise php pour la réouvrir juste après avec une ou plusieurs ligne vide car ceci peut aussi causer l'erreur "headers already sent" et empêcher les redirections php de fonctionner.

<?php
// landing.php

session_start();
require_once 'config.php'; // ajout connexion bdd

// si la session existe pas ou si l'on est pas connecté on redirige
if(!isset($_SESSION['user'])){
	header('Location:index.php');
	die();
}

if(isset($_GET['err'])){
	$err = htmlspecialchars($_GET['err']);
	switch($err){
		case 'current_password':
			$messageAlert = "<div class='alert alert-danger'>Le mot de passe actuel est incorrect</div>";
			break;

		case 'success_password':
			$messageAlert = "<div class='alert alert-success'>Le mot de passe a bien été modifié ! </div>";
			break;
	}
}

// On récupere les données de l'utilisateur
$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();

if (!$data) {
  // $data vaut false, aucun utilisateur correspondant à token = $_SESSION['user'] dans la table
  header('Location: index.php');
  die();
}

if ($data['direction'] === 'Direction des Opérations') {
  header('Location: direction_des_operations.php');
  die();
}

if ($data['direction'] === 'Direction Juridique et Ressources Humaines') {
  header('Location: direction_juridique_et_ressources_humaines.php');
  die();
}

if ($data['direction'] === 'Direction Technique et Financière') {
  header('Location: direction_technique_et_financiere.php');
  die();
}

if ($data['direction'] === 'Direction Générale') {
  header('Location: direction_generale.php');
  die();
}

// si pas de redirection, on affiche le document html : 

?>
<!doctype html>
<html lang="fr">
  <head>
    <title>Espace membre - suivi de l archivage</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="LIEN BOOTSPRAP">
  </head>
  <body>
	  <?php if (isset($messageAlert)) echo $messageAlert; ?>
	  <!-- ... suite du document html ... -->

Comme indiqué dans mon premier message, le contrôle d'accès doit surtout être fait sur les pages cibles (direction_des_operations.php, direction_juridique_et_ressources_humaines.php, etc.).
A ta place, au lieu d'utiliser un input type="submit" pour faire les redirections en fonction de la colonne 'direction' depuis la page landing.php, j'aurai plutôt afficher un lien vers la page concerné en fonction de la colonne 'direction' dans le document html et fait le contrôle d'accès sur les pages cibles.

<?php
// landing.php

session_start();
require_once 'config.php'; // ajout connexion bdd

// si la session existe pas ou si l'on est pas connecté on redirige
if(!isset($_SESSION['user'])){
	header('Location:index.php');
	die();
}

if(isset($_GET['err'])){
	$err = htmlspecialchars($_GET['err']);
	switch($err){
		case 'current_password':
			$messageAlert = "<div class='alert alert-danger'>Le mot de passe actuel est incorrect</div>";
			break;

		case 'success_password':
			$messageAlert = "<div class='alert alert-success'>Le mot de passe a bien été modifié ! </div>";
			break;
	}
}

// On récupere les données de l'utilisateur
$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();

if (!$data) {
  // $data vaut false, aucun utilisateur correspondant à token = $_SESSION['user'] dans la table
  header('Location: index.php');
  die();
}
?>
<!doctype html>
<html lang="fr">
  <head>
    <title>Espace membre - suivi de l archivage</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="LIEN BOOTSPRAP">
  </head>
  <body>
	  <?php if (isset($messageAlert)) echo $messageAlert; ?>
	  <!-- ... suite du document html ... -->
	  
	  <?php if ($data['direction'] === 'Direction des Opérations') : ?>
	  	<a href="/direction_des_operations.php">Direction des Opérations</a>
	  <?php endif; ?
	
	  <?php if ($data['direction'] === 'Direction Juridique et Ressources Humaines') : ?>
	  	<a href="/direction_juridique_et_ressources_humaines.php">Direction Juridique et Ressources Humaines</a>
	  <?php endif; ?
	  
  </body>
</html>

<?php
// direction_des_operations.php

session_start();
require_once 'config.php'; // ajout connexion bdd

// si la session existe pas ou si l'on est pas connecté on redirige
if(!isset($_SESSION['user'])){
	header('Location:index.php');
	die();
}

// On récupere les données de l'utilisateur
$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();

if (!$data) {
  // $data vaut false, aucun utilisateur correspondant à token = $_SESSION['user'] dans la table
  header('Location: index.php');
  die();
}

if ($data['direction'] !== 'Direction des Opérations') {
  // l'utilisateur ne fait pas partie du groupe 'Direction des Opérations', accès interdit à cette page
  header('Location: index.php');
  die();
}

// si l'utilisateur n'est pas redirigé avec la condition juste avant, c'est qu'il fait bien partie du groupe 'Direction des Opérations', on peut donc afficher la page autorisée :

?>
<!doctype html>
<html lang="fr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
	<title>Direction des Opérations</title>
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="LIEN BOOTSPRAP">
  </head>
  <body>
	  Page Direction des Opérations...
  </body>
</html>

Re: Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par Seaotter » 16 août 2022, 15:55

et pour finir je ne peux plus accéder à ma page landing.php qui bascule automatiquement sur index.php

Donc je vais mettre tout le code de ma page ce sera plus simple je pense :



<?php
    session_start();
    require_once 'config.php'; // ajout connexion bdd
   // si la session existe pas ou si l'on est pas connecté on redirige
    if(!isset($_SESSION['user'])){
        header('Location:index.php');
        die();
    }

    // On récupere les données de l'utilisateur
    $req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
    $req->execute(array($_SESSION['user']));
    $data = $req->fetch();

?>



<?php
                        if(isset($_GET['err'])){
                            $err = htmlspecialchars($_GET['err']);
                            switch($err){
                                case 'current_password':
                                    echo "<div class='alert alert-danger'>Le mot de passe actuel est incorrect</div>";
                                break;

                                case 'success_password':
                                    echo "<div class='alert alert-success'>Le mot de passe a bien été modifié ! </div>";
                                break;
                            }
                        }
?>


<?php


$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();



if (!$data) {
  // $data vaut false, aucun utilisateur correspondant à token = $_SESSION['user'] dans la table
  header('Location: index.php');
  die();
}

if ($data['direction'] === 'Direction des Opérations') {
  header('Location: direction_des_operations.php');
  die();
}

if ($data['direction'] === 'Direction Juridique et Ressources Humaines' && isset($_POST['suiviDestruction'])) {
  header('Location: direction_juridique_et_ressources_humaines.php');
  die();
}

if ($data['direction'] === 'Direction Technique et Financière') {
  header('Location: direction_technique_et_financiere.php');
  die();
}

if ($data['direction'] === 'Direction Générale') {
  header('Location: direction_generale.php');
  die();
}

// si $data['direction'] ne correspond pas aux valeurs testées juste avant, on redirige vers index.php
header('Location: index.php');
die();


?>




<!doctype html>
<html lang="en">
  <head>
    <title>Espace membre - suivi de l'archivage</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="LIEN BOOTSPRAP">
  </head>
  <body>
        <div class="container">
            <div class="col-md-12">



                <div class="text-right">
                        <h1 class="p-5">Bonjour <?php echo $data['email']; ?> !</h1>
                        <hr />
                        <a href="deconnexion.php" class="btn btn-danger btn-lg">Déconnexion</a>

                        <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#change_password">
                          Changer mon mot de passe
                        </button>
                        <style>

                        h1 {

                            font-size: 18px;
                            margin: 30px auto;
                            color: red;
                            text-align: right
                        }
                        </style>
                </div>
            </div>
        </div>


        <!-- Modal -->
        <div class="modal fade" id="change_password" tabindex="-1" role="dialog" aria-labelledby="modelTitleId" aria-hidden="true">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title">Changer mon mot de passe</h5>
                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                <span aria-hidden="true">&times;</span>
                            </button>
                         </div>
                            <div class="modal-body">
                                <form action="layouts/change_password.php" method="POST">
                                    <label for='current_password'>Mot de passe actuel</label>
                                    <input type="password" id="current_password" name="current_password" class="form-control" required/>
                                    <br />
                                    <label for='new_password'>Nouveau mot de passe</label>
                                    <input type="password" id="new_password" name="new_password" class="form-control" required/>
                                    <br />
                                    <label for='new_password_retype'>Re tapez le nouveau mot de passe</label>
                                    <input type="password" id="new_password_retype" name="new_password_retype" class="form-control" required/>
                                    <br />
                                    <button type="submit" class="btn btn-success">Sauvegarder</button>
                                </form>
                            </div>
                            <div class="modal-footer">
                                <button type="button" class="btn btn-danger" data-dismiss="modal">Fermer</button>
                            </div>
                        </div>
                    </div>
                </div>

            <div class="modal fade" id="avatar" tabindex="-1" role="dialog" aria-labelledby="modelTitleId" aria-hidden="true">
                <div class="modal-dialog" role="document">
                    <div class="modal-content">
                        <div class="modal-header">
                            <h5 class="modal-title">Changer mon avatar</h5>
                                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                    <span aria-hidden="true">&times;</span>
                                </button>
                        </div>
                        <div class="modal-body">
                            <form action="layouts/change_avatar.php" method="POST" enctype="multipart/form-data">
                                <label for="avatar">Images autorisées : png, jpg, jpeg, gif - max 20Mo</label>
                                <input type="file" name="avatar_file">
                                <br />
                                <button type="submit" class="btn btn-success">Modifier</button>
                            </form>
                        </div>
                        <br />
                        <div class="modal-footer">
                            <button type="button" class="btn btn-danger" data-dismiss="modal">Fermer</button>
                        </div>
                    </div>
                </div>
            </div>
    

    <button onclick="window.location.href = 'formulaire.php';">Compléter les informations du formulaire d'archivage </button>


    <input type="submit" name="directionpage" id = "suiviDestruction" value="Indiquer la date de destruction réelle"  style="background-color:#white" style="color:white; font-weight:bold" onclick>



</html>
</body>

Quand j'enlève tout ce code

<?php


$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();



if (!$data) {
  // $data vaut false, aucun utilisateur correspondant à token = $_SESSION['user'] dans la table
  header('Location: index.php');
  die();
}

if ($data['direction'] === 'Direction des Opérations') {
  header('Location: direction_des_operations.php');
  die();
}

if ($data['direction'] === 'Direction Juridique et Ressources Humaines' && isset($_POST['suiviDestruction'])) {
  header('Location: direction_juridique_et_ressources_humaines.php');
  die();
}

if ($data['direction'] === 'Direction Technique et Financière') {
  header('Location: direction_technique_et_financiere.php');
  die();
}

if ($data['direction'] === 'Direction Générale') {
  header('Location: direction_generale.php');
  die();
}

// si $data['direction'] ne correspond pas aux valeurs testées juste avant, on redirige vers index.php
header('Location: index.php');
die();


?>


J'ai bien de nouveau accès à ma landing page.

Re: Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par Seaotter » 16 août 2022, 15:32

Alors je viens de résoudre le problème de header : j'ai passé tout le code PHP en premier avant tout le code HTML et c'est bon !
il me reste un dernier petit problème :

Je pensais qu'en ajouter ajoutant mon bouton en html puis en passant mes lignes de code PHP, ça allait comprendre que je souhaitais qu'ils atterissent sur la page dédiée en cliquant sur bouton, or avec le code
if ($data['direction'] === 'Direction Générale') {
  header('Location: direction_generale.php, true, 303');
  die();
La personne arrive directement sur cette page sans passer par ma landing page avec le choix des deux boutons
mon bouton :
<input type="submit" name="directionpage" id = "suiviDestruction" value="Indiquer la date de destruction réelle"  style="background-color:#white" style="color:white; font-weight:bold" onclick>
Je ne sais pas comment indiquer de cliquer sur le bouton en + avec if

je pensais peut etre ainsi :

if ($data['direction'] === 'Direction Juridique et Ressources Humaines' && isset($_POST['suiviDestruction'])) {
  header('Location: direction_juridique_et_ressources_humaines.php');
  die();
}
Pour toutes les directions mais ce n'est clairement pas cela, et j'ai du mal a trouvé sur internet. Quand j'ajoute l'appel au bouton la page me renvoie sur index.php mais sans erreur donc il me manque quelque chose

Re: Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par Seaotter » 16 août 2022, 14:44

Bonjour et merci beaucoup pour les explications !!

En effet logique je n'avais pas encore créé mon utilisateur pour la DJRH, seulement celui de la Direction des Opérations était, encore une erreur d'inattention de ma part !!

Merci également pour le code qui est on ne peut plus clair, c'est vraiment génial.
J'ai donc tapé ceci :



$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();

if (!$data) {
  // $data vaut false, aucun utilisateur correspondant à token = $_SESSION['user'] dans la table
  header('Location: index.php');
  die();
}

if ($data['direction'] === 'Direction des Opérations') {
  header('Location: direction_des_operations.php');
  die();
}

if ($data['direction'] === 'Direction Juridique et Ressources Humaines') {
  header('Location: direction_juridique_et_ressources_humaines.php');
  die();
}

if ($data['direction'] === 'Direction Technique et Financière') {
  header('Location: direction_technique_et_financiere.php');
  die();
}

if ($data['direction'] === 'Direction Générale') {
  header('Location: direction_generale.php');
  die();
}

// si $data['direction'] ne correspond pas aux valeurs testées juste avant, on redirige vers index.php
header('Location: index.php');
die();


Mais malheureusement il me reste une dernière erreur que je ne suis pas sûre de comprendre :

Warning: Cannot modify header information - headers already sent by (output started at C:\Users\seaotter\Documents\monsite\landing.php:47) in C:\Users\seaotter\Documents\monsite\landing.php on line 162

le code à partir de la ligne 1 à la ligne 54 :
 

<?php
    session_start();
    require_once 'config.php'; // ajout connexion bdd
   // si la session existe pas soit si l'on est pas connecté on redirige
    if(!isset($_SESSION['user'])){
        header('Location:index.php');
        die();
    }

    // On récupere les données de l'utilisateur
    $req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
    $req->execute(array($_SESSION['user']));
    $data = $req->fetch();

?>
<!doctype html>
<html lang="en">
  <head>
    <title>Espace membre - suivi de l'archivage</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="LIEN BOOTSTRAP QUE JE NE PEUX PAS METTRE ICI " crossorigin="anonymous">
  </head>
  <body>
        <div class="container">
            <div class="col-md-12">
                <?php
                        if(isset($_GET['err'])){
                            $err = htmlspecialchars($_GET['err']);
                            switch($err){
                                case 'current_password':
                                    echo "<div class='alert alert-danger'>Le mot de passe actuel est incorrect</div>";
                                break;

                                case 'success_password':
                                    echo "<div class='alert alert-success'>Le mot de passe a bien été modifié ! </div>";
                                break;
                            }
                        }
                        ?>


                <div class="text-right">
                        <h1 class="p-5">Bonjour <?php echo $data['email']; ?> !</h1>
                        <hr />
                        <a href="deconnexion.php" class="btn btn-danger btn-lg">Déconnexion</a>

                        <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#change_password">
                          Changer mon mot de passe
                        </button>
                        <style>

                        h1 {

                            font-size: 18px;
                            margin: 30px auto;
                            color: red;
                            text-align: right
                        }
                        </style>
                </div>
            </div>
        </div>





En cherchant sur internet j'ai vu que ça pouvait venir de plusieurs causes :

- des espaces avant le <?php du code ou après la balise de fermeture ?>
- Un bloc HTML avant la fonction d’en-tête de PHP
- print ou echo ajoutés avant la fonction d’en-tête PHP
- Problèmes avec le code d’une extension

- Je n'ai pas vu d'espace en trop
- faudrait il que je bouge du code ? pour que du html ne se retrouve pas avant le PHP sachant que j'ai essayé un peu et que cela ne marche pas


J'ai également essayé d'ajouter comme attribut "true" et "303" mais cela ne change rien
enfin j'ai modifié index.php par landing.php sans succès :(

Re: Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par ynx » 13 août 2022, 10:03

Le message d'erreur "Trying to access array offset on value of type bool" correspond l'instruction $data['direction'] : on essaye d'accéder à la clé 'direction' du tableau data, or cette variable $data n'est pas un tableau mais un booléen (true ou false).

La variable $data est définie avec le retour de la méthode $req->fetch(). La méthode fetch() retourne le booléen false si une erreur survient ou si il n'y pas plus de ligne.
Si tu n'as pas d'erreur sql et que $data vaut false, il n'y a donc aucune ligne dans la bdd qui correspond aux critères de la requête (WHERE direction = 'Direction Juridique et Ressources Humaines' AND token = ?).

Tu n'as pas besoin de faire 4 requêtes pour faire la comparaison sur les 4 directions. Tu peux récupérer la colonne direction de l'utilisateur connecté avec ta première requête et faire les comparaison en PHP :
// On récupere les données de l'utilisateur
$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();

if (!$data) {
  // $data vaut false, aucun utilisateur correspondant à token = $_SESSION['user'] dans la table
  header('Location: index.php');
  die();
}

if ($data['direction'] === 'Direction des Opérations') {
  header('Location: direction_des_operations.php');
  die();
} 

if ($data['direction'] === 'Direction Juridique et Ressources Humaines') {
  header('Location: direction_juridique_et_ressources_humaines.php');
  die();
}

if ($data['direction'] === 'Autre direction') {
  header('Location: autre_direction.php');
  die();
}

// si $data['direction'] ne correspond pas aux valeurs testées juste avant, on redirige vers index.php
header('Location: index.php');
die();

Si tu ne vois pas les messages d'erreur sql avec PDO::ERRMODE_EXCEPTION, essaye plutôt PDO::ERRMODE_WARNING à la place dans ton fichier de config.php.

Re: Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par Seaotter » 12 août 2022, 10:48

Bonjour

Et merci encore beaucoup pour le retour et le explications, c'est vraiment gentil de répondre aussi vite et surtout prendre le temps de me répondre tout court !

Alors oui dans ma config j'ai bien le rapport d'erreur activé :
 $dsn = 'mysql:dbname=monsite;host=localhost';
$user = 'root';
$password = '';

try {
    $bdd = new PDO($dsn, $user, $password);
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Échec lors de la connexion : ' . $e->getMessage();
}
 
Merci pour l'indication des guillemets, en effet je les ai complètement oublié.
Par contre j'ai tapé juste cela et j'ai un retour d'erreur :
    

$req = $bdd->prepare("SELECT * FROM utilisateurs WHERE direction = 'Direction des Opérations' AND token = ? ");
$req->execute();
$data = $req->fetch();


Le retour d'erreur :
fatal error: in C:\Users\seaotter\Documents\monsite\landing.php on line 146
( ! ) PDOException: in C:\Users\mauffrais\Documents\monsite\landing.php on line 146


Je ne peux pas ajouter de condition ELSE (enfin de crois) car je dois faire aller l'utilisateur sur une page selon sa direction
donc pour moi si j'ai 4 Directions je dois copié 4 fois le code car je dois indiquer qu'il faut aller chercher par exemple la Direction des ressources humaines dans la BDD ou la direction Générale etc.

Sinon j'ai vraiment besoin d'utiliser le bouton, ne dois pas je indiquer le bouton au sein de ma condition IF ?

IF condition ok


Sinon si je tape le code suivant :

$req = $bdd->prepare("SELECT * FROM utilisateurs WHERE direction = 'Direction des Opérations' AND token = ? ");
$req->execute(array($_SESSION['user']));;
$data = $req->fetch();


if ($data['direction'] === 'Direction des Opérations')
{
header('location: direction_des_operations.php');
die();
}



J'ai cette erreur et je ne comprends pas le retour par rapport au booléen.

) Notice: Trying to access array offset on value of type bool in C:\Users\mauffrais\Documents\monsite\landing.php on line 152



Je ne sais pas si c'est possible d'écrire cela :

$req = $bdd->prepare("SELECT * FROM utilisateurs WHERE direction = 'Direction des Opérations' AND token = ? ");
$req->execute(array($_SESSION['user']));;
$data = $req->fetch();


if ($data['direction'] === 'Direction des Opérations')

{
header('location: direction_des_operations.php');
die();
}

else
{
$req = $bdd->prepare("SELECT * FROM utilisateurs WHERE direction = 'Direction Juridique et Ressources Humaines' AND token = ? ");
$req->execute(array($_SESSION['user']));;
$data = $req->fetch();

if ($data['direction'] === 'Direction Juridique et Ressources Humaines')

{
header('location: direction_juridique_et_ressources_humaines.php');
die();

} }


Mais j'ai toujours la meme erreur :

( ! ) Notice: Trying to access array offset on value of type bool in C:\Users\mauffrais\Documents\monsite\landing.php on line 152
Call Stack
# Time Memory Function Location
1 0.0017 362736 {main}( ) ...\landing.php:0

( ! ) Notice: Trying to access array offset on value of type bool in C:\Users\mauffrais\Documents\monsite\landing.php on line 165
Call Stack
# Time Memory Function Location

Je suis désolée pour ce long message mais je voudrais tellement comprendre.

Re: Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par ynx » 11 août 2022, 18:15

Bonjour,

Comme vu sur la précédente discussion, le rapport d'erreur de PDO est bien activé en mode warning ou exception ? Il semble que ta requête sql ne soit pas correcte donc tu devrais avoir un message d'erreur sql en plus du message d'erreur PHP pour t'aider à corriger cette requête.

Il manque notamment des guillemets autour de la valeur 'Direction des Opérations' dans ta requête.
Tu passes aussi un paramètres $_SESSION['user'] dans la méthode execute de cette requête préparée mais celle-ci ne contient pas de marqueur "?". Il ne faut pas passer de paramètre dans execute si ta requête n'a pas de marqueur.
$req = $bdd->prepare("SELECT * FROM utilisateurs WHERE direction = 'Direction des Opérations'");
$req->execute();
$data = $req->fetch();
Cette requête va récupérer tous les utilisateurs qui ont la colonne 'Direction des Opérations'. Si tu veux vérifier uniquement pour l'utilisateur connecté, il faut ajouter AND token = ? dans la clause WHERE de ta requête et passer le paramètre $_SESSION['user'] dans la méthode execute.

Néanmoins si je comprends bien le déroulement de ton code, tu récupères déjà l'utilisateur connecté en début de page.
Il ne semble donc pas nécessaire de refaire une deuxième requête, tu peux faire une comparaison sur la colonne direction de l'utilisateur connecté récupéré avec la première requête :
// On récupere les données de l'utilisateur
$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();

if ($data['direction'] === 'Direction des Opérations') {
	header('Location: direction_des_operations.php');
	die();
} else {
	header('Location: index.php');
	die();
}

Si ce n'est pas déjà le cas, cette vérification devrait surtout être faite au début de la page direction_des_operations.php pour rediriger l'utilisateur si il n'est pas autorisé à accéder à cette page (l'utilisateur peut charger cette page sans passer par ton bouton en saisissant directement l'url).

Rediriger vers une page dédiée selon l'appartenance d'un user à un groupe

par Seaotter » 11 août 2022, 16:56

Bonjour à tous,

Comme déjà indiqué je suis débutante, en PHP et en code.
J'essaye depuis hier de faire en sorte qu'un utilisateur faisant partie d'une Direction puisse accéder à sa page qui lui est dédiée en cliquant sur le bouton "indiquer la date réelle de destruction".
J'ai essayé plusieurs codes infructueux et je n'ai plus d'idées...

le dernier en date sur ma landing page étant celui-ci :



<input type="submit" name="DOP" value="Indiquer la date de destruction réelle" style="background-color:#white" style="color:white; font-weight:bold"onclick>

<?php



$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE direction = Direction des Opérations');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();


if ($req == true) {
header('Location: direction_des_operations.php'); die();
}


?>


Le problème vient de ma variable req qui renvoie " Fatal error: in C:\Users\mauffrais\Documents\monsite\landing.php on line 148"

J'ai le cerveau en bouillie a force de modifier :D mais je pense qu'il manque plusieurs élements

POur info tout est déclaré en début de page :

<?php
session_start();
require_once 'config.php'; // ajout connexion bdd
// si la session existe pas soit si l'on est pas connecté on redirige
if(!isset($_SESSION['user'])){
header('Location:index.php');
die();
}

// On récupere les données de l'utilisateur
$req = $bdd->prepare('SELECT * FROM utilisateurs WHERE token = ?');
$req->execute(array($_SESSION['user']));
$data = $req->fetch();

?>


et dans ma base de donnée j'ai bien un champs de type VARCHAR nommé : direction
Enfin, $_SESSION est déclarée dans la page de connexion : $_SESSION['user'] = $data['token'];

En vous remerciant si vous avez des solutions à mon problème.

Cordialement