web-dev-qa-db-fra.com

PHP: Comment vérifier si l'utilisateur est déjà connecté et sinon rediriger vers la page de connexion

Je suis nouveau sur PHP et j'ai des difficultés avec les éléments suivants: 

J'ai une page où je veux vérifier si quelqu'un est un utilisateur enregistré avant de lui permettre de voir le contenu du site. Je pensais donc que, dans mon fichier d’en-tête (qui est référencé sur toutes les pages individuelles via require_once("includes/header.php");), je peux le vérifier et les rediriger vers une page de connexion (login.php) s’ils ne se sont pas encore connectés. 

Alors voici tout ce que j'ai dans ma tête:  

<!DOCTYPE html>
<html>
    <head>
        <?php 
            define("someUnguessableVariable", "anotherUnguessableVariable");
            session_start();
            if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
                header ("Location: login.php");
            }

            include "system/config.php";

            $pageURL = basename($_SERVER["REQUEST_URI"]);
            $pageName = pathinfo(parse_url($pageURL, PHP_URL_PATH), PATHINFO_FILENAME); 

            $selectedLang = $_GET["lang"];
                if(!isset($selectedLang)){
                    $selectedLang = "de";
                }
            $langURL = "?lang=" . $selectedLang;

            $conn = new mysqli($dbServer, $dbUser, $dbPass, $dbName);
            $conn->set_charset("utf8");
            if($conn->connect_error){
                die("Connection failed: " . $conn->connect_error);
            } 
            // fetch main translations
            $location = "%main%";
            $stmt = $conn->prepare("SELECT tID, " . $selectedLang . " FROM TranslationsMain WHERE location LIKE ? ORDER BY tID");
            $stmt->bind_param("s", $location);
            $stmt->execute();
            $result = $stmt->get_result();  
            while($arrTranslations = $result->fetch_assoc()){
                $trans[] = array("ID" => $arrTranslations["tID"], "trans" => $arrTranslations[$selectedLang]);
            }
            $conn->close();

            // get main translations by ID
            function fetchTransMain($trans, $itemID){
                foreach($trans as $key => $val){
                    if($val["ID"] == $itemID){
                        return $val["trans"];
                    }
                }
            }
        ?>

        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta name="author" content="Some author" />
        <meta name="description" content="Created: 2015-06" />

        <base href="http://www.myurl.de" target="_self" />

        <title>Some title</title>

        <!-- CSS -->        
        <link rel="stylesheet" type="text/css" href="includes/styles.css" />
        <!-- CSS - Font Awesome -->
        <link rel="stylesheet" type="text/css" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" />

        <!-- include favicon -->
        <link rel="shortcut icon" href="images/favicon/favicon.ico" type="image/x-icon" />
        <link rel="icon" href="images/favicon/favicon.png" type="image/png" />
        <link rel="icon" sizes="32x32" href="images/favicon/favicon-32.png" type="image/png" />
        <link rel="icon" sizes="64x64" href="images/favicon/favicon-64.png" type="image/png" />
        <link rel="icon" sizes="96x96" href="images/favicon/favicon-96.png" type="image/png" />
        <link rel="icon" sizes="196x196" href="images/favicon/favicon-196.png" type="image/png" />
        <link rel="Apple-touch-icon" sizes="152x152" href="images/favicon/Apple-touch-icon.png" />
        <link rel="Apple-touch-icon" sizes="60x60" href="images/favicon/Apple-touch-icon-60x60.png" />
        <link rel="Apple-touch-icon" sizes="76x76" href="images/favicon/Apple-touch-icon-76x76.png" />
        <link rel="Apple-touch-icon" sizes="114x114" href="images/favicon/Apple-touch-icon-114x114.png" />
        <link rel="Apple-touch-icon" sizes="120x120" href="images/favicon/Apple-touch-icon-120x120.png" />
        <link rel="Apple-touch-icon" sizes="144x144" href="images/favicon/Apple-touch-icon-144x144.png" />
        <meta name="msapplication-TileImage" content="favicon-144.png" />
        <meta name="msapplication-TileColor" content="#ffffff" />

        <script>
            var baseURL = '<?php echo $baseURL; ?>';
            var pageURL = '<?php echo $pageURL; ?>';
            var pageName = '<?php echo $pageName; ?>';
            var selectedLang = '<?php echo $selectedLang; ?>';
        </script>
    </head>   
    <body>

Maintenant, cela ne fonctionne pas et je pense que je manque probablement quelques éléments, mais je ne pouvais pas trouver un bon tutoriel ou des directives à ce sujet. De plus, je ne suis pas sûr qu’il me reste à faire quelque chose pour démarrer et configurer la session. 

Quelqu'un peut il m'aider avec ça ?

Remarque:
Il s’agit uniquement de vérifier si un utilisateur est déjà connecté, étant donné que tous les enregistrements et vérifications de l’utilisateur se font sur la page de connexion distincte et que le code est déjà opérationnel. 

Mise à jour: L'activation des messages d'erreur renvoie les erreurs suivantes: 

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 9

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 9
array(0) { } 
Warning: Cannot modify header information - headers already sent by (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 12

Notice: Undefined index: lang in /homepages/21/d580042014/htdocs/includes/header.php on line 18

Mettre à jour:
Conformément aux commentaires, je publie maintenant tout ce qui est actuellement dans l'en-tête.

Merci d'avance.

5
TaneMahuta

Mise à jour: La question a été résolue dans chat .


Selon votre édition, changez ce bloc:

<!DOCTYPE html>
<html>
    <head>
        <?php 
            define("someUnguessableVariable", "anotherUnguessableVariable");
            session_start();
            if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
                header ("Location: login.php");
            }

à:

<?php 
session_start();
?>

<!DOCTYPE html>
<html>
    <head>
        <?php 
            define("someUnguessableVariable", "anotherUnguessableVariable");

            if(!isset($_SESSION['login']) && $_SESSION['login'] != ''){
                header ("Location: login.php");
                exit; // stop further executing, very important
            }
  • Suivez la même structure pour démarrer la session dans tous vos fichiers en utilisant des sessions.
  • Assurez-vous que votre fichier ne comporte pas de marque d'ordre d'octet (BOM).
  • Pas d'espace avant <?php etc. cela a déjà été établi dans les commentaires.

Utilisez un éditeur de code tel que Notepad ++ https://notepad-plus-plus.org/ et sauvegardez-le au format UTF-8 sans nomenclature, ce qui garantira l'absence de marque d'ordre d'octet.

En outre, en utilisant la nouvelle méthode pour votre vérification de groupe de sessions.

if(!isset($_SESSION['login']) && $_SESSION['login'] != ''){

Vérifiez également qu'aucun des fichiers inclus/requis ne présente les mêmes problèmes, y compris login.php.


Notes de bas de page:

Dans le menu déroulant du Notepad ++, vous verrez

  • Codage. Il vous montrera ce que l'encodage du fichier actuel est défini.

S'il affiche une marque d'ordre d'octet, procédez comme suit:

  1. Cliquez sur "Encodage".
  2. Conversion en UTF-8 sans nomenclature
  3. Enregistrez le fichier.

    • Faites cela pour tous vos fichiers.

Références):


Sidenote:

Vous devriez changer $stmt->execute(); en

if(!$stmt->execute()){
    trigger_error("there was an error....".$conn->error, E_USER_WARNING);
}
  • Il est préférable de détecter d'éventuelles erreurs dans votre requête.
10
Funk Forty Niner

Tu dois bouger 

session_start();
if((!isset($_SESSION['login']) && $_SESSION['login'] != '')){
    header ("Location: login.php");
}

en haut du script et déplacez ! dans le support.

2
petebolduc

Placez le profil de l'utilisateur dans les variables de session dans le script PHP que vous appelez après la page de connexion.

$_SESSION['user_id'] = $row["user_id"];
$_SESSION['profile_id'] = $row["profile_id"];
$_SESSION['name'] = $row["name"];
$_SESSION['surname'] = $row["surname"];
$_SESSION['application_auth'] = $row["application_auth"];

Placez le code suivant en haut de chaque page que vous souhaitez protéger par des utilisateurs non valides

<?php 
include("sessionCheck.php");
?>

Le script sessionCheck Dans ce cas, je vérifie également si l'utilisateur est autorisé à afficher la page spécifique à l'aide de l'identifiant profile_id mais vous pouvez la supprimer 

<?php
    session_start();
    if(!IsSet($_SESSION['user_id']) or $_SESSION['profile_id'] !=1)
    {
        header("location: http://www.yourdomain.com/login.php?message=Invalid user");
    }   
?>
1
Luca

La partie suivante devrait aller avant include "system/config.php"; car il semble que ce fichier est en sortie et aussi le fait que le code suivant ne dépend d'aucune autre donnée.

session_start();
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
    header ("Location: login.php");
}

Seconde:

if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){

Devrait probablement être: if(!isset($_SESSION['login']) && $_SESSION['login'] == ''){

signifiant == '' et non != ''

Un utilisateur non connecté n'aura probablement pas de valeur (en fonction de votre code) afin que votre code vérifie s'il n'est pas vide et que seuls les utilisateurs connectés seront transférés.

Par conséquent:

<?php
define("someUnguessableValue", "anotherUnguessableValue");
session_start();
if(!isset($_SESSION['login']) && $_SESSION['login'] == ''){
    header("location:login.php");
}

include "system/config.php";
//.... the rest
?>
<!DOCTYPE html>
<html>
    <head>

Si ce n'est pas le cas, alors $ _SESSION ['login'] est probablement défini, vous devez effacer les cookies de ce domaine.

1
Onimusha