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:
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:
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:
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:
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...