Bonjour à tous et à toutes,

j'ai suivi le tuto de http://www.nicwalle.com/index.php?page=watch&list=creer-un-blog-20 pour créer un site. J'ai fini de coder la première version que je vais mettre en ligne. Cependant lorsque je mets le site en ligne, je rencontre un problème que je n'ai pas en local c'est à dire que lorsqu'on fait http://developpement.irobotechart.com/admin/ on est tout de suite connecté. Mais on ne possède pas d'adresse mail, elle est nul car lorsqu'on est connecté cela affiche Vous êtes connecté [adresse_mail] ! Du coup une session est créé sans adresse mail. Lorsqu'on se login avec un compte cela fonctionne.

Pour résumé, une session est automatiquement créée, je vous mets différentes pages de l'admin, mais s'il vous manque du code pour m'aider, n'hésitez pas à me le dire car je n'ai aucune idée de ce que je dois vous donner.

index.php

<?php
include '../functions/main-functions.php';

$pages = scandir('pages/');
if(isset($_GET['page']) && !empty($_GET['page'])){
    if(in_array($_GET['page'].'.php',$pages)){
        $page = $_GET['page'];
    }else{
        $page = "error";
    }
}else{
    $page = "dashboard";
    unset($_SESSION['admin']);
}

$pages_functions = scandir('functions/');
if(in_array($page.'.func.php',$pages_functions)){
    include 'functions/'.$page.'.func.php';
}

?>

<!DOCTYPE html>
<html>
<head>
    <link href="http://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    <link type="text/css" rel="stylesheet" href="../css/materialize.css"  media="screen,projection"/>
    <link rel="stylesheet" type="text/css" href="markitup/skins/markitup/style.css" />
    <link rel="stylesheet" type="text/css" href="markitup/sets/markdown/style.css" />
    <title>iRoboTechArt | Administration</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>

<body>

<?php

if($page != 'login' && $page != 'new' && !isset($_SESSION['admin'])){
    header("Location:index.php?page=login");
}

include "body/topbar.php";
?>
<div class="container">
    <?php
    include 'pages/'.$page.'.php';
    ?>
</div>

<!--Import jQuery before materialize.js-->
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="../js/materialize.js"></script>
<script type="text/javascript" src="../js/script.js"></script>
<?php
$pages_js = scandir('js/');
if(in_array($page.'.func.js',$pages_js)){
    ?>
    <script type="text/javascript" src="js/<?= $page ?>.func.js"></script>
<?php
}

?>
<script type="text/javascript" src="markitup/jquery.markitup.js"></script>
<script type="text/javascript" src="markitup/sets/markdown/set.js"></script>
<script type="text/javascript" >
    $(document).ready(function() {
        mySettings.previewParserPath = 'parser.php';
        $(".markItUp").markItUp(mySettings);
    });
</script>
</body>
</html>

login.php

<?php
    if(isset($_SESSION['admin'])){
        header("Location:index.php?page=dashboard");
    }
?>

<div class="row">
    <div class="col l4 m6 s12 offset-l4 offset-m3">
        <div class="card-panel">
            <div class="row">
                <div class="col s6 offset-s3">
                    <img src="../img/admin.png" alt="Administrateur" width="100%"/>
                </div>
            </div>

            <h4 class="center-align">Se connecter</h4>

            <?php
                if(isset($_POST['submit'])){
                    $email = htmlspecialchars(trim($_POST['email']));
                    $password = htmlspecialchars(trim($_POST['password']));

                    $errors = [];

                    if(empty($email) || empty($password)){
                        $errors['empty'] = "Tous les champs n'ont pas été remplis!";
                    }else if(is_admin($email,$password) == 0){
                        $errors['exist']  = "Cet administrateur n'existe pas";
                    }

                    if(!empty($errors)){
                        ?>
                        <div class="card red">
                            <div class="card-content white-text">
                                <?php
                                    foreach($errors as $error){
                                        echo $error."<br/>";
                                    }
                                ?>
                            </div>
                        </div>
                        <?php
                    }else{
                        $_SESSION['admin'] = $email;
                        header("Location:index.php?page=dashboard");
                    }

                }

            ?>

            <form method="post">
                <div class="row">
                    <div class="input-field col s12">
                        <input type="email" id="email" name="email"/>
                        <label for="email">Adresse email</label>
                    </div>

                    <div class="input-field col s12">
                        <input type="password" id="password" name="password"/>
                        <label for="password">Mot de passe</label>
                    </div>
                </div>

                <center>
                    <button type="submit" name="submit" class="waves-effect waves-light btn light-blue">
                        <i class="material-icons left">perm_identity</i>
                        Se connecter
                    </button>
                    <br/><br/>
                    <a href="index.php?page=new">Nouveau modérateur</a>
                </center>

            </form>

        </div>
    </div>
</div>

main-function.php

<?php

    //A modifier en fonction de vos indentifiants de base de donnée
    $dbhost = 'rempli';
    $dbname = 'rempli';//Ne doit pas être modifié si vous avez appelé votre bdd "blog"
    $dbuser = 'rempli';
    $dbpswd = 'rempli';
    //A partir d'ici, vous ne devez plus rien modifier

    try{
        $db = new PDO('mysql:host='.$dbhost.';dbname='.$dbname,$dbuser,$dbpswd,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
    }catch(PDOexception $e){
        die("Une erreur est survenue lors de la connexion à la base de données");
    }
// Définition des rôles
function admin(){
    if(isset($_SESSION['admin'])){
        global $db;
        $a = [
            'email'     =>  $_SESSION['admin'],
            'role'      =>  'admin'
        ];

        $sql = "SELECT * FROM admins WHERE email=:email AND role=:role";
        $req = $db->prepare($sql);
        $req->execute($a);
        $exist = $req->rowCount($sql);

        return $exist;
    }else{
        return 0;
    }
}

function hasnt_password(){
    global $db;

    $sql = "SELECT * FROM admins WHERE email = '{$_SESSION['admin']}' AND password = ''";
    $req = $db->prepare($sql);
    $req->execute();
    $exist = $req->rowCount($sql);
    return $exist;
}

dashboard.php

<?php

if(hasnt_password() == 1){
    header("Location:index.php?page=password");
}

if(director()==1){
    header("Location:index.php?page=video");
}

?>

<h2>Tableau de bord</h2>
<div class="row">
   <pre>
    <?php
    echo "Vous êtes connecté ".$_SESSION['admin'] ." !";
    ?>
</pre>

Merci d'avance pour votre aide et si j'ai mal formulé ou vous avez besoin de plus d'infos, demandez moi ^^

12 réponses


Bonjour,

En parcourant le code, il ne semble pas avoir vu de "session_start();" pour démarrer les sessions.
De plus vous vérifiez seulement la présence de la clé "admin" dans la session et non ça valeur donc au niveau sécurité, ce n'est pas le top.

Comme la dit @Carouge10, il faut mettre un session_start() à chaque page ou tu a besoin de t'a session.
Tu peux ajouter ceci, ça initialise une session si il y en a pas :

if(session_status() == PHP_SESSION_NONE){
    session_start();
}
Fatavis
Auteur

Tout d'abord merci d'essayer de m'aider @Carouge10 et @Fukotaku, @Fukotaku j'ai donc mis le bout de code que tu m'as passé maintenant j'ai une nouvelle erreur mais je pense qu'on avance :

La page developpement.irobotechart.com ne fonctionne pas

developpement.irobotechart.com vous a redirigé à de trop nombreuses reprises.
Essayez de supprimer les cookies..
ERR_TOO_MANY_REDIRECTS

Cependant quand j'enlève ça le message ne s'affiche pas et je rencontre toujours le problème que j'ai dit plus haut:

if($page != 'login' && $page != 'new' && !isset($_SESSION['admin'])){
    header("Location:index.php?page=login");
}

J'en déduis donc que c'est à cause de ce bout de code qu'il y a une infinité de redirection, mais je ne sais toujours pas résoudre le problème.

Revois t'es redirections et les variables que tu met dans t'es conditions

Fatavis
Auteur

Mais justement je comprends pas parce que normalement, il ne devrait pas avoir de redirection comme on est sur la page login et que

$page != 'login'

Change ça:

if($page != 'login' && $page != 'new' && !isset($_SESSION['admin']))

par ça:

if( ($page != 'login' || $page != 'new') && !isset($_SESSION['admin']) )
Fatavis
Auteur

Merci pour ton aide mais cela ne fonctionne toujours pas. Cela m'exaspère surtout qu'en local le code marchait parfaitement.

Salut,

Si tu affiches les contenu de ta session et ton $page, quels sont les resultats affichés?

Fatavis
Auteur

Lorsque je suis sur login cela affiche login et quand je suis sur dashboard cela affiche dashboard.

Tu n'as pas détruit t'a session avec un coup de session_destroy() pour comparer ?

Fatavis
Auteur

Cela ne change rien au niveau, il y a toujours une chargement infini de la page.

Fatavis
Auteur

J'ai finalement réussi à résoudre mon problème de la façon suivante :

$pages = scandir('pages/');
if(isset($_GET['page']) && !empty($_GET['page'])){
    if(in_array($_GET['page'].'.php',$pages)){

        if($_GET['page'] != 'login' && $_GET['page'] != 'new' && !isset($_SESSION['admin'])){
            $page = 'login';
        }else{
            $page = $_GET['page'];
        }

    }else{
        $page = "error";
    }
}else{
    $page = "dashboard";
            if($_GET['page'] != 'login' && $_GET['page'] != 'new' && !isset($_SESSION['admin'])){
            $page = 'login';
        }else{
            $page = $_GET['page'];
        }

}

Je suis trop content ^^ merci à tous pour votre aide et votre soutien, un grand MERCI !!!