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 :
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
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">
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
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"); ?>
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 </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; ?>
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...
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)); ?>
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...
Partager