Script php recharger deux fois la page pour afficher

Fermé
thiry - Modifié le 5 févr. 2022 à 22:36
jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 - 7 févr. 2022 à 14:07
Bonjour à tous, je débute en php et j'ai pour projet de faire un site perso avec un système d'identification des usagers.

je vous explique vite fait mon principe (sujet à discussion), sur ma page index, je vais charger toutes mes pages en fonction de l'utilisateur dont l'identité et les droits sont récupérés dans ma bdd.

Le problème est que une fois avoir rempli mon formulaire ,il est traité et il faut que je recharge la page manuellement pour avoir l'affichage de mes pages. Je vous transmet le code et vous pouvez l'essayer en cliquant sur ce lien https://clementthiry64.000webhostapp.com/

voici le code de l'index


<?php session_start(); ?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Site Personnel Clément Thiry</title>
        <link rel="icon" type="image/png" href="images/book.png" />
        <link rel="stylesheet" href="style.css"/>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script type="text/javascipt" src="scripts/javascript.js"></script>
        <?php include('scripts/config_perso.php');
        ?>
    </head>
     
    <body>
 
    <?php echo 'test session'.(isset($_SESSION['identite']));
    if (isset($_SESSION['identite'])and isset($_SESSION['droits'])){ ?>
        <p>Vous êtes connectés en tant que <span class="identite"><?php echo espace($_SESSION['identite']); ?></span>.</p>
        <?php //fonction qui insère les pages en fonction des droits
            include('pages/presentation_site.php'); ?>
     
     
     
     
    <form action="pages/deconnexion.php" method="post">
        <p><input type="submit" value="Déconnexion" name="Déconnexion" id="Déconnexion"/></p>
    </form>
     
     
    <?php
    }
else{
    //echo '</br>else ok';
    include('pages/login.php');
    //echo'</br>include passsé';
}   ?>
 
     
    </body>
</html>


et le code du login

<?php
    session_start();
    $erreur='';
    if ((isset($_POST['username']) and !(empty($_POST['username']))) and (isset($_POST['password']) and !(empty($_POST['password'])))){
        echo '</br> cas où formulaire rempli';
        $verif_username=true;
        //echo 'formulaire complet </br>';
        $username=strip_tags($_POST['username']);
        //echo $username;
        $password=strip_tags($_POST['password']);
        //echo $password;
        $requeteStatement=$bdd->prepare('SELECT * FROM connexion WHERE username=:username');
        $requeteStatement->execute(['username'=>$username,
                                    ]);
        $resultat=$requeteStatement->fetchAll();
        debug($resultat);
        //echo 'test password : '.($resultat[0]['password']==$password);
        if($resultat[0]['password']==$password)
        {echo '</br>infos d\'identification ok';
        $_SESSION['identite']=$resultat[0]['identite'];
        //echo 'test identité'.$_SESSION['identite'];
        $_SESSION['droits']=$resultat[0]['droits'];
        //echo 'test droits '.$_SESSION['droits'];
        //$_SESSION['connexion']=isset($_SESSION['identite'])and isset($_SESSION['droits']);
        //echo 'test connexion '.$_SESSION['connexion'];
        }
        else{
            //echo '</br> connexion echouée';
            $_SESSION['connexion']=0;
            echo'</br>erreur d\'authentification : vérifiez votre identitfiant et
            votre mot de passe<p>lien vers l\'espace d\'<a href="index.php"> authentification</a></p>';
            //include('connexion_ko.php');}
     
     
        ?>
 
 
    <?php }
    }
    else { //echo '</br> cas où formulire vide';
    ?>
    <h1>Identifiez-vous avant de découvrir ce site en conception</h1>
<div class="login" ><form method="post" action="">
    <fieldset>Authentification
    </br><p>Saisissez vos informations de connection pour accéder à votre contenu</br>
    <label for="username">Identifiant : </label></br>
    <input type="text" name="username" id="username" placeholder="Saisissez votre identifiant"/></br></br>
    <label for="password"> Mot de passe : (8 caractères minimum, pas de '<', 1 majuscule et 1 minuscule)</label></br>
    <input type="password" name="password" id="password" placeholder="Saisissez votre mot de passe"/></br>
    <label for="checkbox">
        <input type="checkbox" id="checkbox">
        Afficher le mot de passe
    </label></br>
    <script type="text/javascript">$(document).ready(function(){
        var checkbox = $("#checkbox");
        var password = $("#password");
        checkbox.click(function(){
            if(checkbox.prop("checked")) {
                password.attr("type", "text");
            } else {
                password.attr("type", "password");
            }
        });
    });
    </script>
    <input type="submit" value="Se connecter"/>
    </fieldset>
</form></div>
<p>Sinon, vous pouvez vous connecter avec ces informations: </br>
    <ul><li>identifiant : visiteur</li>
    <li> mot de passe : visiteur</li></ul>
</p>
    <?php } ?>


J'ai essayé d'appeler la fonction header('Refresh : 0.1') et cela fonctionne en local qd je teste mon code su Uwamp mais pas sur mon hébergeur...
Merci d'avance de votre réponse et surtout si quelque chose vous choque concernant la façon dont est implémenté tout ça, n'hésitez pas à faire des suggestions =}


EDIT: Correction des balises de code ( ajout du LANGAGE pour avoir la coloration syntaxique, l'indentation et la numérotation des lignes...) Merci d'y penser à l'avenir.
A voir également:

4 réponses

yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 551
5 févr. 2022 à 20:36
bonjour,
tu écris "Le problème est que une fois avoir rempli mon formulaire ,il est traité et il faut que je recharge la page manuellement pour avoir l'affichage de mes pages"
S'agit-il du formulaire de login traité par le code du login?
Montre nous le code avec l'appel à header.
Cela ne marche pas sur ton hébergeur: as-tu un message d'erreur?
Précise bien aussi, pour chaque page, comment elle s'appelle, et où elle se trouve.
0
jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 4 704
5 févr. 2022 à 22:44
Bonjour,

Reprenons le déroulement de ton code ...

On arrive sur la page index ... qui inclue la page de login (vu que les variables de session ne sont pas encore remplies )
On rempli le formulaire et on clique sur submit
Cela recharge la page index qui va encore inclure ta page de login ( vu que le traitement n'a pas encore été fait )
Et là .. il rempli les variables de session ... mais tu ne lui demandes pas de recharger à nouveau la page...


Donc ..
Dans l'immédiat, il te suffirait d'ajouter une "redirection" lorsque l'authentification est valide. Pour ça, tu peux utiliser l'instruction header de php.

Une autre solution .. ( le plus souvent utilisée...) c'est :
On arrive sur la page index ...
Si l'utilisateur n'est pas connecté on REDIRIGE ( avec l'instruction header ) vers la page de login ( je dis bien REDIRIGER et non INCLURE .. )
Une fois l'authentification faite, on redirige vers la page index


0
Ok j'essaye ça maintenant merci
0
Bonjour et merci encore pour le coup de main =)
voici le code modifié de index :

<?php session_start();
include('scripts/config_perso.php');
if($maintenace==1){echo 'maintenance en cours';}
else{
//echo 'test session'.(isset($_SESSION['identite']));

if (isset($_SESSION['identite'])and isset($_SESSION['droits'])){
include('pages/header.php');?>


<?php
//echo '</br>'.debug($_SESSION['droits']);?>
<p>Vous êtes connectés en tant que <span class="identite"><?php echo espace($_SESSION['identite']); ?></span>.</p>
<ol>
<?php //fonction qui insère les pages en fonction des droits
foreach(array_keys($_SESSION['droits']) as $page){
//echo $page.' => '.$_SESSION['droits'][$page].'</br>';
if($_SESSION['droits'][$page]!=0){ ?>

<li><a href="index.php?a=<?php echo $page; ?>"><?php echo espace($page); ?></a></li>


<?php }
};
if (!empty($_GET['a'])){
$action = (!empty($_GET['a'])) ? $_GET['a'].'.php' : 'index.php';
//echo '</br> action = '.$action;
if (is_file('pages/'.$action)){
include('pages/'.$action);
}

}
elseif($_SESSION['droits']['vigi']==3){
//echo '</br> droits vigi = '. $_SESSION['droits']['vigi'];
include('pages/vigi.php');
}
else{
include('pages/presentation_site.php');
}
?></ol>




<form action="pages/deconnexion.php" method="post">
<p><input type="submit" value="Déconnexion" name="Déconnexion" id="Déconnexion"/></p>
</form>
</body>
</html>


<?php
}
else{
//echo '</br>header ok';
header('Location : pages/login.php');
//echo'</br>header passsé'; ?>

<?php
}
} ?>





Résultat page vierge de vierge, erreur avec l'appel de la fonction header car qd je décommente les echo, ils sont affichés et pas le login...

et le code modifié de login :
<?php 
session_start();
include('config_perso.php');
$erreur='';
if (!(empty($_POST['username'])) and !(empty($_POST['password']))){
//echo '</br> cas où formulaire rempli';
$verif_username=true;
//echo 'formulaire complet </br>';
$username=$_POST['username'];
//echo $username;
$password=$_POST['password'];
//echo $password;
$requeteStatement=$bdd->prepare('SELECT * FROM connexion WHERE username=:username');
$requeteStatement->execute(['username'=>$username,
]);
$resultat=$requeteStatement->fetchAll();
//debug($resultat);
//echo 'test password : '.($resultat[0]['password']==$password);
if($resultat[0]['password']==$password)
{echo '</br>Rechrgez la page';
$_SESSION['identite']=$resultat[0]['identite'];
//echo 'test identité'.$_SESSION['identite'];
$_SESSION['droits']=droits($resultat[0]['droits']);
header('../index.php');
//echo 'test droits '.$_SESSION['droits'];
//$_SESSION['connexion']=isset($_SESSION['identite'])and isset($_SESSION['droits']);
//echo 'test connexion '.$_SESSION['connexion'];
}
else{
//echo '</br> connexion echouée';
$_SESSION['connexion']=0;
echo'</br>erreur d\'authentification : vérifiez votre identitfiant et
votre mot de passe<p>lien vers l\'espace d\'<a href="index.php"> authentification</a></p>';
//include('connexion_ko.php');}





}
}
else { //echo '</br> cas où formulire vide';
include('header.php');
?>
<h1>Identifiez-vous avant de découvrir ce site en conception</h1>
<div class="login" ><form method="post" action="">
<fieldset>Authentification
</br><p>Saisissez vos informations de connection pour accéder à votre contenu</br>
<label for="username">Identifiant : </label></br>
<input type="text" name="username" id="username" placeholder="Saisissez votre identifiant"/></br></br>
<label for="password"> Mot de passe : (8 caractères minimum, 1 majuscule et 1 minuscule)</label></br>
<input type="password" name="password" id="password" placeholder="Saisissez votre mot de passe"/></br>
<label for="checkbox">
<input type="checkbox" id="checkbox">
Afficher le mot de passe
</label></br>
<script type="text/javascript">$(document).ready(function(){
var checkbox = $("#checkbox");
var password = $("#password");
checkbox.click(function(){
if(checkbox.prop("checked")) {
password.attr("type", "text");
} else {
password.attr("type", "password");
}
});
});
</script>
<input type="submit" value="Se connecter"/>
</fieldset>
</form></div>
<p>Sinon, vous pouvez vous connecter avec ces informations: </br>
<ul><li>identifiant : visiteur</li>
<li> mot de passe : visiteur</li></ul>
<form action="pages/inscription.php" method="post">
<p><input type="submit" value="s'inscrire" name="inscription" id="inscription"/></p>
</form>
</p>

<?php } ?>
0
jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 4 704
Modifié le 6 févr. 2022 à 11:18
Déjà, il serait bien d'utiliser les balises de code correctement c'est-à-dire en y précisant le langage afin que l'on ait la coloration syntaxique et une indentation propre du code .

Ensuite, l'instruction header ne peut pas se trouver après des instructions d'affichage que ça soit après des échos ou simplement des balises HTML.
(Ton include de ton fichier header par exemple)
Il faut donc modifier ton code afin de traiter la redirection avant d'afficher quoi que ce soit sur ta page
0
jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 4 704 > jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024
6 févr. 2022 à 11:17
Pour les balises de code Voici un tuto pour apprendre à les utiliser
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
Merci encore pour le coup de main ça commence à m'énerver mais l'expérience sera utile sûrement pour mes futures études...

Alors voilà j'ai modifié mon index en appelant la fonction header avant d'appeler include. Résultat = page blanche... mais si je décommente le echo juste en dessous, il s'affiche donc la encore c'est le header qui bloque...
je te transmet le code le code de l'index(avec la bonne utilisation des balises ;-) )
<?php session_start(); 
  if (!(isset($_SESSION['identite'])and isset($_SESSION['droits']))){
   header('Location : pages\login.php');
   //echo '</br>header passé';
   

 
  
    ?>
  
 
 
  <?php 
  } 
  else{ 
   include('scripts/config_perso.php');
   echo "</br>connectés";
 
   include('pages/header.php');


 
   //echo '</br>'.debug($_SESSION['droits']);?>
   <p>Vous êtes connectés en tant que <span class="identite"><?php echo espace($_SESSION['identite']); ?></span>.</p>
   <ol>
   <?php //fonction qui insère les pages en fonction des droits
    foreach(array_keys($_SESSION['droits']) as $page){
     //echo $page.' => '.$_SESSION['droits'][$page].'</br>';
     if($_SESSION['droits'][$page]!=0){ ?>
     
      <li><a href="index.php?a=<?php echo $page; ?>"><?php echo espace($page); ?></a></li>
     
     
     <?php }
    };
    if (!empty($_GET['a'])){
     $action = (!empty($_GET['a'])) ? $_GET['a'].'.php' : 'index.php';
     //echo '</br> action = '.$action;
     if (is_file('pages/'.$action)){
      include('pages/'.$action);
     }

    } 
    elseif($_SESSION['droits']['vigi']==3){
     //echo '</br> droits vigi = '. $_SESSION['droits']['vigi'];
     include('pages/vigi.php');
    }
    else{
     include('pages/presentation_site.php');
    }
    ?>
   </ol>
 
 
 
 
   <form action="pages/deconnexion.php" method="post">
    <p><input type="submit" value="Déconnexion" name="Déconnexion" id="Déconnexion"/></p>
   </form>
  </body>
 </html>
 
<?php
  }  
  ?>

 
 



et de plus, tu m'avais parlé de faire une redirection de login vers index une fois les données traitées or j'ai vraiment besoin "d'importer " certaines fonctions du fichier config_perso.php qui se trouve dans le dossier scripts.
Donc, en principe et en pratique je ne peux pas appeler la fonction header après include.


Après, je me suis renseigné sur des méthodes alternatives par exemple en utilisant la balise
<meta http-equiv="Refresh" content="0; url=../index.php" />
à insérer quelque part dans mon code initial de login pour rediriger de login vers index ?
0
jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 4 704
6 févr. 2022 à 15:06
Voici ton code quelque peu amélioré
<?php 
session_start(); 

//activer l'affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//récupération PROPRE des variables AVANT de les utiliser
$identite = !empty($_SESSION['identite']) ? $_SESSION['identite'] : NULL;
$droits = !empty($_SESSION['droits']) ? $_SESSION['droits'] : NULL;
$action = !empty($_GET['a']) ? trim($_GET['a']).'.php' :NULL;
 
 if (!$identite && !$droits){
   header('Location : pages\login.php');
   exit; //toujours mettre un exit après un header
 }  //pas besoin de ELSE .. si tu entres dans le IF tu es redirigé sur une autre page de toutes façons
  
  
   require_once 'scripts/config_perso.php';
   echo "</br>connectés";
 
   require_once 'pages/header.php'; // c'est lui qui contient le début de ton html ? 

?>

   <p>Vous êtes connectés en tant que <span class="identite"><?php echo espace($identite); ?></span>.</p>
   <ol>
  <?php //fonction qui insère les pages en fonction des droits
    foreach($droits as $page){
  ?>
      <li><a href="index.php?a=<?php echo $page; ?>"><?php echo espace($page); ?></a></li>
  <?php 
    }
  
    if ($action){
     //echo '</br> action = '.$action;
     if (file_exists('pages/'.$action)){
      require_once 'pages/'.$action;
     }

    }elseif($droits['vigi']==3){
     //echo '</br> droits vigi = '. $_SESSION['droits']['vigi'];
     include 'pages/vigi.php';
    } else{
     include 'pages/presentation_site.php' ;
    }
    ?>
   </ol>

   <form action="pages/deconnexion.php" method="post">
    <p><input type="submit" value="Déconnexion" name="Deconnexion" id="Deconnexion"/></p> <!-- pas d'accents dans les ID ou les NAME !! -->
   </form>
  </body>
 </html>

0
thiry > jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024
7 févr. 2022 à 14:02
merci pour le code, page blanche en résultat... mais pourrais-tu m'expliquer
$identite = !empty($_SESSION['identite']) ? $_SESSION['identite'] : NULL;
j'avai repris une ligne de code comme ça sur le fichier de mon prof de NSI, mais je ne l'avais pas comprise
merci
0
jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 4 704 > thiry
7 févr. 2022 à 14:07
c'est ce qu'on appel l'écriture ternaire.
C'est une sorte de if else

ça remplace
if(!empty($_SESSION['identite'])){
  $identite =$_SESSION['identite'];
}else{
  $identite =NULL;
}


pour en revenir à ta page blanche .. cela peut provenir de tes includes...

Commence par ajouter un echo à la ligne 18 du genre
echo "OK";
puis mets en commentaire toutes les lignes qui se trouvent en dessous ( de la 19 à la fin )
regarde si le echo s'affiche..
SI oui...
Retire les commentaires puis déplace ton echo quelques lignes plus bas dans ton code et mets en commentaire les lignes qui suivent et ainsi de suite jusqu'à ce que le echo ne s'affiche plus...
ça te permettra de trouver à quelle ligne l'erreur se situe
0