IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Perte de $_SESSION sans raison


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut Perte de $_SESSION sans raison
    Bonjour tout le monde,

    Voilà j'ai passé de nombreux mois à développer un logiciel qui permet de créer son RPG en PHP (Juste textuel) avec Xampp ça fonctionne à merveille je peux naviguer de page en page sans aucun soucis. Mais sur mon hébergeur OVH c'est l'inverse, un coup ça peut marcher pendant plusieurs heures et d'un coup j'aurais beau me connecter et naviguer sur n'importe quel page du jeu mon navigateur perd la $_SESSION['account']['id'];

    Voici une vidéo que j'ai faite et qui en explique le soucis où j'ai fait un var_dump($_SESSION) dans le header:
    https://youtu.be/7wUNP9wKzzM

    Je vais vous montrer les 3 scripts qui s’exécutent en même temps (Le header inclus dans le script, le script, et le footer inclus dans le script)

    Le Header :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    <?php
    ob_start();
    //On démarre le module des sessions de PHP
    session_start();
    //On récupère le temps Unix actuel une première fois
    $timeStart = microtime(true);
    //On inclue le fichier de configuration qui contient les paramètre de connexion SQL ainsi que la création d'un objet $bdd pour les requêtes SQL
    require_once("../../kernel/config.php");
    //On récupère les informations de configuration du jeu
    require_once("../../kernel/configuration/index.php");
    //Si la session $_SESSION['token'] est vide c'est que le joueur à validé un formulaire
    if (empty($_SESSION['token']))
    {
        //On génère un token qu'on stock dans une session pour sécuriser les formulaires
        $_SESSION['token'] = uniqid();
    }
    //Si le joueur est connecté on va récupérer toutes les informations du joueur (Compte, Personnage, Combat en cours...)
    if (isset($_SESSION['account']['id']))
    {
        //On récupère toutes les informations du compte
        require_once("../../kernel/account/index.php");
        //On récupère toutes les informations du personnage grâce au compte
        require_once("../../kernel/character/index.php");
        //On vérifie si le personnage est actuellement dans un combat de monstre. Si c'est le cas on récupère toutes les informations du monstre
        require_once("../../kernel/battle/index.php");
        //On récupère toutes les informations des équipements équipé au personnage
        require_once("../../kernel/equipment/index.php");
        //On récupère toutes les informations des type d'équipement
        require_once("../../kernel/equipmentType/index.php");
        //On vérifie le nombre d'offre dans le marché
        require_once("../../kernel/market/index.php");
        //On vérifie le nombre de message de notifications non lue
        require_once("../../kernel/notification/index.php");
        //On vérifie le nombre de message de conversation privée non lu
        require_once("../../kernel/privateConversation/index.php");
        //On vérifie si le personnage est actuellement dans une ville. Si c'est le cas on récupère toutes les informations de la ville
        require_once("../../kernel/town/index.php");
        //On vérifie le nombre de d'échange en cours
        require_once("../../kernel/trade/index.php");
        //On vérifie le nombre de demande d'échange en cours
        require_once("../../kernel/tradeRequest/index.php");
    }
    ?>
     
    <!DOCTYPE html>
    <html lang="fr">
        <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
            <meta name="description" content="">
            <meta name="author" content="">
            <link rel="icon" href="../../favicon.ico">
     
            <title><?php echo $gameName ?></title>
     
            <!-- Bootstrap core CSS -->
            <link href="../../css/bootstrap.min.css" rel="stylesheet">
     
            <!-- Custom styles for this template -->
            <link href="../../css/navbar-top-fixed.css" rel="stylesheet">
        </head>
     
        <body>
            <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
                <a class="navbar-brand" href="../../modules/main/index.php"><?php echo $gameName ?></a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="collapse navbar-collapse" id="navbarsExampleDefault">
                    <ul class="navbar-nav mr-auto">
                        <li class="nav-item dropdown">
                            <a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Accueil</a>
                            <div class="dropdown-menu" aria-labelledby="dropdown01">
                                <a class="dropdown-item" href="../../modules/main/index.php">Actualité</a>
                                <a class="dropdown-item" href="../../modules/presentation/index.php">Présentation</a>
                                <a class="dropdown-item" href="../../modules/races/index.php">Les classes</a>
                                <a class="dropdown-item" href="../../modules/contact/index.php">Contact</a>
                                <a class="dropdown-item" href="../../modules/about/index.php">A propos</a>
                            </div>
                        </li>
     
                        <?php
                        //Si le joueur est connecté on affiche le menu du jeu
                        if (isset($_SESSION['account']['id']))
                        {
                            ?>
     
                            <li class="nav-item dropdown">
                                <a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Personnage</a>
                                <div class="dropdown-menu" aria-labelledby="dropdown01">
                                    <a class="dropdown-item" href="../../modules/character/index.php">Fiche complète</a>
                                    <a class="dropdown-item" href="../../modules/skillPoints/index.php">Points de compétences</a>
                                    <a class="dropdown-item" href="../../modules/inventory/index.php">Inventaire</a>
                                </div>
                            </li>
     
                            <li class="nav-item dropdown">
                                <a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Aventure</a>
                                <div class="dropdown-menu" aria-labelledby="dropdown01">
                                    <a class="dropdown-item" href="../../modules/story/index.php">Continuer l'aventure</a>
     
                                    <?php
                                    //Si characterTownId est supérieur ou égal à un le joueur est dans une ville. On met le raccourcit vers la ville
                                    if($characterTownId >= 1)
                                    {
                                        ?>
     
                                        <a class="dropdown-item" href="../../modules/town/index.php">Retourner en ville</a>
     
                                        <?php
                                    }
                                    //Si characterTownId n'est pas supérieur ou égal à un le joueur est dans aucune ville. On met le raccourcit vers la carte du monde
                                    else
                                    {
                                        ?>
     
                                        <a class="dropdown-item" href="../../modules/map/index.php">Carte du monde</a>
     
                                        <?php
                                    }
                                    ?>
                                    <a class="dropdown-item" href="../../modules/bestiary/index.php">Bestiaire</a>
                                    <a class="dropdown-item" href="../../modules/travelogue/index.php">Carnet de voyage</a>
                                </div>
                            </li>
     
                            <li class="nav-item dropdown">
                                <a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Communauté</a>
                                <div class="dropdown-menu" aria-labelledby="dropdown01">
                                    <a class="dropdown-item" href="../../modules/arena/index.php">Arène (PVP)</a>
                                    <a class="dropdown-item" href="../../modules/chat/index.php">Chat</a>
                                    <a class="dropdown-item" href="../../modules/privateConversation/index.php">Messagerie privée (<?php echo $privateConversationNumberRow ?>)</a>
                                    <a class="dropdown-item" href="../../modules/tradeRequest/index.php">Place des échanges (<?php echo $tradeRequestRow + $tradeRow ?>)</a>
                                    <a class="dropdown-item" href="../../modules/market/index.php">Le marché (<?php echo $marketOfferQuantityRow ?>)</a>
                                </div>
                            </li>     
                        <?php
                        }
                        ?>
                    </ul>
                    <ul class="navbar-nav pull-right">
                        <li class="nav-item dropdown">
                            <a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Mon compte</a>
                            <div class="dropdown-menu" aria-labelledby="dropdown01">
                                <?php
                                //Si le joueur est connecté on lui donne la possibilité de se déconnecter
                                if (isset($_SESSION['account']['id']))
                                {
                                    ?>
     
                                    <a class="dropdown-item" href="../../modules/account/index.php">Informations</a>
                                    <a class="dropdown-item" href="../../modules/notification/index.php">Notifications (<?php echo $notificationNumberRow ?>)</a>
     
                                    <?php
                                    switch ($accountAccess)
                                    {
                                        case 0:
     
                                        break;
     
                                        case 1:
                                        ?>
                                        <?php
                                        break;
     
                                        case 2:
                                        ?>
     
                                        <a class="dropdown-item" href="../../administration/main/index.php">Administration</a>
     
                                        <?php
                                        break;
                                    }
                                    ?>
     
                                    <a class="dropdown-item" href="../../modules/logout/index.php">Déconnexion</a>
     
                                    <?php
                                }
                                //Sinon on propose au joueur de s'inscrire ou se connecter
                                else
                                {
                                    ?>
     
                                    <a class="dropdown-item" href="../../modules/login/index.php">Connexion</a>
                                    <a class="dropdown-item" href="../../modules/register/index.php">Inscription</a>
     
                                    <?php
                                }
                                ?>
                            </div>
                        </li>
                    </ul>
                </div>
            </nav>
     
            <!-- Main jumbotron for a primary marketing message or call to action -->
            <div class="container">
                <div class="jumbotron">
    La script qui affiche le personnage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?php require_once("../../html/header.php");
     
    //S'il n'y a aucune session c'est que le joueur n'est pas connecté alors on le redirige vers l'accueil
    if (empty($_SESSION)) { exit(header("Location: ../../index.php")); }
    //S'il y a actuellement un combat on redirige le joueur vers le module battle
    if ($battleRow > 0) { exit(header("Location: ../../modules/battle/index.php")); }
    ?>
     
    <p><img src="<?php echo $characterPicture ?>" height="100" width="100"></p>
     
    <?php echo $characterName ?><br />
    Classe : <?php echo $characterRaceName ?><br />
     
    <hr>
     
    Niveau : <?php echo $characterLevel ?><br />
    <?php echo $itemArmorNameShow ?> : <?php echo $equipmentArmorName ?><br />
    <?php echo $itemBootsNameShow ?> : <?php echo $equipmentBootsName ?><br />
    <?php echo $itemGlovesNameShow ?> : <?php echo $equipmentGlovesName ?><br />
    <?php echo $itemHelmetNameShow ?> : <?php echo $equipmentHelmetName ?><br />
    <?php echo $itemWeaponNameShow ?> : <?php echo $equipmentWeaponName ?><br />
    HP : <?php echo "$characterHpMin/$characterHpTotal" ?><br />
    MP : <?php echo "$characterMpMin/$characterMpTotal" ?><br />
    Force : <?php echo $characterStrengthTotal ?><br />
    Magie : <?php echo $characterMagicTotal ?><br />
    Agilité : <?php echo $characterAgilityTotal ?><br />
    Défense : <?php echo $characterDefenseTotal ?><br />
    Défense Magique : <?php echo $characterDefenseMagicTotal ?><br />
    Sagesse : <?php echo $characterWisdomTotal ?><br />
    Prospection : <?php echo $characterProspectingTotal ?><br />
    Défaite(s) en arène : <?php echo $characterArenaDefeate ?><br />
    Victoire(s) en arène : <?php echo $characterArenaVictory ?><br />
    Expérience : <?php echo "$characterExperience/$experienceLevel" ?><br />
    Prochain niveau dans : <?php echo $experienceRemaining ?><br />
    Experience total : <?php echo $characterExperienceTotal ?><br />
    Argent : <?php echo $characterGold ?><br />
     
    <?php require_once("../../html/footer.php"); ?>
    Et le footer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    </div>
            </div>
     
            <?php
                //On récupère une seconde fois le temps Unix actuel
                $timeEnd = microtime(true);
                //On soustrait le temps Unix obtenu dans le header pour le soustraire avec celui eu juste au dessus pour obtenir le temps d'execution de la page'
                $time = $timeEnd - $timeStart;
                //On formate le résultat en secondes
                $pageLoadTime = number_format($time, 3);
                //On affiche le résultat en bas de la page
                echo "<center>Temps d'exécution de la page: {$pageLoadTime} secondes<br /></center>";
                echo "<center>Caranille : $version</center>";
            ?>
     
            <script src="../../js/jquery-3.2.1.min.js"></script>
            <script src="../../js/popper.min.js"></script>
            <script src="../../js/bootstrap.min.js"></script>
        </body>
    </html>
     
    <?php
    //On ferme la connexion à la base de donnée
    $bdd = null;
    ?>
    Voilà (Pour les fichiers dans kernel comme character, configuration etc c'est rien de plus que des scripts de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    //On déclare les variables nécessaire pour la requête SQL
    $accountId = $_SESSION['account']['id'];
     
    $accountQuery = $bdd->prepare("SELECT * FROM car_accounts
    WHERE accountId = ?");
    $accountQuery->execute([$accountId]);
     
    //On fait une boucle pour récupérer les résultats
    while ($account = $accountQuery->fetch())
    {
        //On récupère les informations du compte
        $accountId = stripslashes($account['accountId']);
        $accountPseudo = stripslashes($account['accountPseudo']);
        $accountEmail = stripslashes($account['accountEmail']);
        $accountAccess = stripslashes($account['accountAccess']);
        $accountStatus = stripslashes($account['accountStatus']);
        $accountReason = stripslashes($account['accountReason']);
        $accountLastAction = stripslashes($account['accountLastAction']); 
        $accountLastConnection = stripslashes($account['accountLastConnection']);       
        $accountLastIp = stripslashes($account['accountLastIp']);
    }
    $accountQuery->closeCursor();
     
    $accountLastAction = $date = date('Y-m-d H:i:s');
     
    //On met à jour la dernière action du compte dans la base de donnée
    $updateAccount = $bdd->prepare("UPDATE car_accounts SET
    accountLastAction = :accountLastAction
    WHERE accountId = :accountId");
    $updateAccount->execute(array(
    'accountLastAction' => $accountLastAction,  
    'accountId' => $accountId));
    ?>
    En gros je ne garde que un $_SESSION['account']['id'] et si cette session existe je crée toutes les variable nécessaire dans mon jeu, des variable du compte en passant par celle du personnage, de ses équipements etc...

    Si vous voulez télécharger le projet c'est cette adresse: http://www.caranille.com/downloads/Caranille-1.6.9.zip

    Je ne comprends pas pourquoi il y a que sur OVH que ma session disparaît sans raison et surtout sans log d'erreur (Bizarrement sur mon smartphone je n'ai pas le soucis, c'est seulement sur mon ordinateur que ce soit Firefox ou Chrome)

    Si vous voulez le voir de vous même aller sur http://www.caranille.com inscrivez-vous, connectez-vous et essayez de naviguer mais c'est assez aléatoire alors que mon code est censé sois fonctionner soit ne pas fonctionner pas faire un coup l'un, un coup l'autre...)

    Merci à celui ou celle qui trouvera une solution à ce soucis infernal...

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Quelques pistes :

    • Mettre des echo dans tes fichiers pour localiser où et quand à lieu la perte de session
    • Vérifier les majuscules / minuscules dans les noms de variables et de fichiers
    • Vérifier que session_start est bien présent partout.


    [EDIT] (je n'avais pas vu la vidéo)
    Tu veux dire que tu perds la session simplement en "actualisant" la page ??
    Dernière modification par Invité ; 15/11/2017 à 08h27.

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 090
    Points
    43 090
    Par défaut
    Une session a une durée de vie, définie par le serveur (dans le php.ini), c'est session.lifetime

    Tu peux la connaitre via :
    Si a 0, la session est valable jusqu'à fermeture du navigateur, sinon c'est exprimé en nombre de secondes.

    Tu ne peux pas modifier cette valeur.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Bonjour,
    Oui je perd la session et je la récupère rien qu'en rafraîchissant la page... et ce soucis ne vient qu'à certain moment, par moment je n'aurais rien pendant plusieurs heures et après ça va s’enchaîner...

    Et avec mon XAMPP en local zéro perte de connexion donc je ne comprends pas, est-ce du côté de chez OVH que ça bloque ?

    Bien cordialement,

  5. #5
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut
    Salut,

    j'ai déjà rencontré ce genre de souci, je l'avais résolu en mettant des points d’arrêt régulier dans le code jusqu'à trouver la fonction qui posait problème.

    Je réécrivais la variable session dans une fonction, c'est tout bête mais souvent c'est parce que c'est tout bête qu'on y pense pas. Par contre le fait que ce ne soit pas toujours le cas et uniquement sur OVH, ça c'est louche...

  6. #6
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par Geoffrey74 Voir le message
    Salut,

    j'ai déjà rencontré ce genre de souci, je l'avais résolu en mettant des points d’arrêt régulier dans le code jusqu'à trouver la fonction qui posait problème.

    Je réécrivais la variable session dans une fonction, c'est tout bête mais souvent c'est parce que c'est tout bête qu'on y pense pas. Par contre le fait que ce ne soit pas toujours le cas et uniquement sur OVH, ça c'est louche...
    Oui en local ça ne pose aucun soucis avec XAMPP et sur mon téléphone portable pour le moment je n'ai pas encore eu ce soucis, ce n'est que avec mon ordinateur portable ou fixe que j'ai ça et les joueurs eux ils jouent que avec un mobile et ça fonctionne sans soucis...

    En quoi OVH causerait t'il cela ?

    Je penses avoir une piste, quand je ne joue au jeu que depuis 1 seul ordinateur sur le même réseau aucun soucis, mais quand je le fais sur deux en même temps ça pose soucis. Comme si le serveur arrivait plus à gérer le token de connexion

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Montre nous ton code de session.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par Caranille Voir le message
    Comme si le serveur arrivait plus à gérer le token de connexion
    Ça c’est sûr puisqu’il y a deux sessions. Pour rappel, une session est portée par un cookie, et un cookie est propre à un navigateur.

    Si le problème se produit uniquement sur ton serveur OVH, c’est bien évidemment une histoire de configuration du serveur.

    Pour compléter les propos de chrtophe, il y a bien une directive php.ini qui régit la durée des sessions, elle s’appelle session.cookie_lifetime. J’ai moi-même un espace mutualisé sur OVH, et mon phpinfo() indique que cette valeur est à 0.
    Si tu es toi aussi en mutu, tu ne peux pas modifier cette valeur de manière statique, c’est-à-dire avec un php.ini personnalisé ou une instruction spéciale dans un .htaccess. En revanche, tu peux la modifier au début d’un script PHP avec la fonction ini_set.

    Mais je soupçonne que le problème est ailleurs… Comme le demande sabotage, montre-nous s’il-te-plaît le code où tu initialises la session.

    En attendant, ce que tu peux faire c’est vérifier dans l’onglet réseau des outils F12 de ton navigateur, si le cookie de session est là d’une requête à l’autre, et s’il a toujours la même valeur. Essaye aussi de déterminer si le problème se manifeste toujours à peu près au bout du même temps ou si c’est juste aléatoire.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  9. #9
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    Voici la page qui crée la session et c'est la seul qui créer cette session

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    <?php 
    require_once("../../html/header.php");
     
    //Si les variables $_POST suivantes existent
    if (isset($_POST['accountPseudo']) 
    && isset($_POST['accountPassword'])
    && isset($_POST['token'])
    && isset($_POST['login']))
    {
        //Si le token de sécurité est correct
        if ($_POST['token'] == $_SESSION['token'])
        {
            //On supprime le token de l'ancien formulaire
            $_SESSION['token'] = NULL;
     
            //Récupération des valeurs des deux champs dans une variable
            $accountPseudo = htmlspecialchars(addslashes($_POST['accountPseudo']));
            $accountPassword = sha1(htmlspecialchars(addslashes($_POST['accountPassword'])));
     
            //On fait une requête pour vérifier si le pseudo et le mot de passe concorde bien
            $accountQuery = $bdd->prepare("SELECT * FROM car_accounts 
            WHERE accountPseudo = ?
            AND accountPassword = ?");
            $accountQuery->execute([$accountPseudo, $accountPassword]);
            $accountRow = $accountQuery->rowCount();
     
            //S'il y a un résultat de trouvé c'est que la combinaison pseudo/mot de passe est bonne
            if ($accountRow == 1)
            {
                //Dans ce cas on boucle pour récupérer le tableau retourné par la base de donnée pour récupérer les informations du compte
                while ($account = $accountQuery->fetch())
                {
                    //On récupère les informations du compte comme l'id et les accès (joueur, modérateur, administrateur)
                    $accountId = stripslashes($account['accountId']);
                    $accountAccess = stripslashes($account['accountAccess']);
     
                    //Si le jeu est ouvert au public
                    if ($gameAccess == "Opened")
                    {
                        //On définit une date pour mettre à jour la dernière connexion du compte
                        $date = date('Y-m-d H:i:s');
     
                        //On créer une session qui ne contiendra que l'id du compte
                        $_SESSION['account']['id'] = stripslashes($account['accountId']);
                        $accountId = $_SESSION['account']['id'];
     
                        //On met la date de connexion à jour
                        $updateAccount = $bdd->prepare("UPDATE car_accounts SET 
                        accountLastConnection = :accountLastConnection
                        WHERE accountId = :accountId");
                        $updateAccount->execute(array(
                        'accountLastConnection' => $date,   
                        'accountId' => $accountId));
                        $updateAccount->closeCursor();
     
                        header("Location: ../../index.php");
                    }
                    //Si le jeu est fermé au public
                    else
                    {
                        //Si le joueur est administrateur il peut se connecter
                        if ($accountAccess == 2)
                        {
                            //On définit une date pour mettre à jour la dernière connexion du compte
                            $date = date('Y-m-d H:i:s');
     
                            //On créer une session qui ne contiendra que l'id du compte
                            $_SESSION['account']['id'] = stripslashes($account['accountId']);
                            $accountId = $_SESSION['account']['id'];
     
                            //On met la date de connexion à jour
                            $updateAccount = $bdd->prepare("UPDATE car_accounts SET 
                            accountLastConnection = :accountLastConnection
                            WHERE accountId = :accountId");
                            $updateAccount->execute(array(
                            'accountLastConnection' => $date,   
                            'accountId' => $accountId));
                            $updateAccount->closeCursor();
     
                            header("Location: ../../index.php");
                        }
                        //Si le joueur n'est pas administrateur on lui refuse l'accès
                        else
                        {
                            echo "Une maintenance est actuellement en cours, merci de réessayer plus tard.";
                        }
                    }
                }
            }
            //S'il n'y a aucun résultat de trouvé c'est que la combinaison pseudo/mot de passe est mauvaise
            else
            {
                echo "Mauvais Pseudo/Mot de passe";
            }
            $accountQuery->closeCursor();
        }
        //Si le token de sécurité n'est pas correct
        else
        {
            echo "Erreur : Impossible de valider le formulaire, veuillez réessayer";
        }
    }
    //Si toutes les variables $_POST n'existent pas
    else
    {
    	echo "Tous les champs n'ont pas été rempli";
    }
     
    require_once("../../html/footer.php"); ?>
    Et il y a une autre page qui se nomme lougout.php qui la détruit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php require_once("../../html/header.php");
     
    //S'il n'y a aucune session c'est que le joueur n'est pas connecté alors on le redirige vers l'accueil
    if (empty($_SESSION['account'])) { exit(header("Location: ../../index.php")); }
     
    //On détruit la session complète
    session_destroy();
     
    //On redirige le joueur vers la page d'accueil
    header("Location: ../../index.php");
     
    require_once("../../html/footer.php"); ?>
    Je n'ai que deux sessions dans mon projet, une avec l'id du compte et une avec un token pour les formulaire et à chaque validation de formulaire je détruits la session du token comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $_SESSION['token'] = NULL;
    EDIT: je viens de faire un F12 et j'ai un cookie qui chante juste de valeur mais seulement quand je valide un formulaire donc c'est celui des token je penses
    Nom : erreur.PNG
Affichages : 2072
Taille : 12,6 Ko

    Bien cordialement,

  10. #10
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Non, le cookie de session c’est PHPSESSID, c’est indiqué dans le phpinfo si tu veux vérifier.
    La valeur token est contenue dans ton tableau $_SESSION, le client ne la voit pas sauf quand tu l’envoies explicitement avec un echo, comme lorsque tu produis les <input>.
    Le cookie SERVERID585 est généré directement par ton serveur OVH, j’ai fait une rapide recherche pour vérifier, d’autres utilisateurs d’OVH l’ont aussi.

    Je pense que tu fais une petite confusion entre la session et les données contenues dans la session. Je m’explique : $_SESSION, comme tu le sais, est un tableau (array). Quand le session_start se déroule normalement, $_SESSION est automatiquement peuplé avec les données de session correspondant au PHPSESSID transmis avec la requête du client. En supposant que la session existe déjà, parmi ces données il y a $_SESSION['token'] et $_SESSION['account']. Ces deux choses font partie de la même session. Fais un var_dump($_SESSION) pour t’en convaincre.

    Au passage, je te remercie car grâce à toi j’ai appris qu’on pouvait initialiser directement un tableau à plusieurs dimensions. C’est la deuxième chose que j’apprends aujourd’hui sur un langage que je pratique depuis bientôt dix ans, c’est assez fou

    Une hypothèse qui me vient à l’esprit tout à coup : en regardant la directive session.save_path du phpinfo, j’ai la valeur /tmp, ce qui m’indique deux choses :
    • que les données de sessions sont stockées dans le système de fichier ;
    • que ces données sont stockées à un emplacement qui m’est inaccessible (au-dessus de mon dossier racine quand je me connecte en SSH ou FTP).

    Encore une fois je ne sais pas si on est exactement sur la même architecture, mais il se pourrait que cet espace de stockage soit géré en load balancing (c’est même certain en ce qui me concerne), technique consistant à virtualiser les hébergements sur différentes machines physiques, et qu’il y aurait des pertes de cohérence quand le balanceur fait passer ton hébergement d’une machine à une autre. J’ai trouvé des archives indiquant que ça s’est déjà produit par le passé. Je n’ai jamais constaté ce problème moi-même, mais il faut dire que je ne fais pas une utilisation intensive des sessions.

    Je n’ai rien trouvé dans ton code qui donne un indice sur une autre cause possible du problème, aussi il va falloir s’armer de patience et examiner ce qui se passe avec les cookies. Je n’ai pas d’autre idée, désolé :/

    Edit : apparemment tu n’es pas tout seul.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Au passage les htmlspecialchars/addslashes/stripslashes n'ont rien à faire
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    pour ma part, je te conseille de mettre sur la TOUTE PREMIERE ligne du fichier principal :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php session_start();
    et dans les fichiers susceptibles d'être inclus et contenant une variable de SESSION :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php if( empty(session_id()) ){ session_start(); }


    Cela dit, j'ai de nombreux sites sur OVH, et jamais rencontré ce problème...

  13. #13
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Bonjour,
    Merci de vos réponses, je viens de mettre mon projet sur un VPS de chez OVH que j'ai configuré moi même de façon basique et pour le moment aucune perte de connexion.

    Le soucis vient donc de OVH et non pas de mon projet Mais quand je contact OVH ils me disent ha mais nous il y a aucun soucis, voyez votre webmaster... Bref.

    Je vous tiendrais au courant dimanche soir de si ça tiens toujours

    Cordialement,

  14. #14
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    salut

    je viens de regarder ta petite démo, en effet ça pose des questions.
    Est ce que tu sais comment sont stockées les sessions chez ovh ? simplement sous forme de fichier?
    regarde de ce coté ci: http://php.net/manual/fr/session.customhandler.php si tu connais pas le mécanisme,
    il est possible qu'il y ait soit un fs plein (bah oui) ou un appel trop fréquent du garbage collector ou une durée de vie inadéquate (http://php.net/manual/fr/sessionhandler.gc.php).
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  15. #15
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    ça fait une semaine que mon projet est sur un VPS et... Zéro déconnexion, le soucis vient donc de OVH et pas de mon code (Ouf ^^).

    Donc bon je commençais à en avoir marre de OVH mais là c'est juste pas possible et quand je les contactent ils me disent que c'est mon code qui pose soucis alors que il a toujours fonctionné et que du jour au lendemain sur OVH ça marche plus :p

    Mais merci de ta réponse

  16. #16
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    Je reviens vers vous sur mon propre poste car le soucis continue et j'avoue j'en suis désespéré...

    Sur un VPS ou serveur dédié aucun soucis mais en mutualisé une catastrophe, je navigue de page en page et d'un coup le site me met que je suis pas connecté, je fais un simple F5 (Sans formulaire rien) et je récupère ma session...

    De plus je souhaiterai savoir combien pourrait coûter un petit audit du code (Je demande pas quelques chose de complet) mais juste voir si il y a des choses à ne surtout pas faire qui au premier coup d'oeil pourrait arracher la rétine à certains ^^

    Voici le reposit de mon code:
    http://github.com/caranille/caranille.

    Bien cordialement,

  17. #17
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Bonjour Caranille,

    Je rencontre le même problème que toi chez OVH.
    J'ai un compte mutualisé performance x2
    Des déconnexions permanentes pour mes clients mais aussi sur le CMS que j'utilise et comme c'est un CMS , il est impossible de modifier quoi que ce soit sur les sessions gérées par le CMS.
    Avant ça marchait et depuis 2 jours, c'est la cata.
    OVH me dit que tout fonctionne !!
    Pourtant plein de forum parlent de ce problème chez eux.

    As tu résolu ton problème ?
    merci de partager tes solutions.

    Franck

Discussions similaires

  1. BUG: pertes des droits d'acces sans raisons apparentes
    Par myz-rix dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 28/05/2015, 21h17
  2. [OL-2007] Perte des catégories de contact sans raisons
    Par gribouille75017 dans le forum Outlook
    Réponses: 1
    Dernier message: 11/03/2012, 14h33
  3. Perte de connexion sans raison
    Par Takis dans le forum JDBC
    Réponses: 2
    Dernier message: 08/03/2008, 20h47
  4. NET::FTP unknown error sans raison
    Par niocco dans le forum Modules
    Réponses: 11
    Dernier message: 29/06/2005, 20h21
  5. ma base gonfle sans raison !!!
    Par hiul dragonfel dans le forum Access
    Réponses: 6
    Dernier message: 20/06/2005, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo