8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je rencontre un problème très bizarre...
Je suis en train de construire un jeu du pendu (affichage de l'alphabet dont les lettres sont en liens) et je constate via un var_dump que dès que ma 7e valeur est sélectionnée, la sélection se fait par paires automatiquement... Toutefois, cela ne se passe qu'en local sur ma machine et non lorsque je visite ma page en ligne / en production...

Je vous joins une capture d'écran pour que vous visualisiez :
upload/51817-Le-jeu-du-.png

J'ai changé deux broutilles au niveau de l'error reporting dans mon php.ini (via mon wamp), mais rien de plus.
Avez-vous une idée de ce qui peut provoquer cette sélection double qui apparait systématiquement dès la 7e valeur et ce, uniquement en local??

J'imagine que mon code ne vous sera d'aucun secours si je n'ai pas de problème en production ?

Merci pour vos idées éventuelles !
Ok.
Alors le code est long, donc je vous le propose à l'extérieur si ça vous convient.
Il y a deux fichiers :

Un petit : fichier 1 - un gros : fichier 2

Vous noterez que mon code n'est pas très optimisé, je débute Smiley confused .
(Mes "unset session" foirent aussi...)
Il n'est pas non plus finalisé.
Salut, je n'ai pas regardé le code pour l'instant et j'ai survolé car tu dis qu'il y a un delta entre la prod et ton local, tu peux vérifier ta version de PHP pour commencer? Les données traitées sont elles les mêmes en local et en ligne? Essaie d'avoir le même environnement de dév quand tu travailles Smiley smile
Salut Floreo Smiley smile !
Je suis sous PHP 5.3 en prod et 5.4.12 en local.
Les données traitées sont les même en local qu'en production, oui.
Je vais peut-être essayer de trouver un php.ini intact et le comparer à celui dont je dispose sur mon wamp avec diffnow pour voir s'il y a des différences qui sont susceptibles d'affecter le bon fonctionnement de mon script...
Salut Smiley smile
peux tu mettre la même version de PHP local/prod? Utilises tu des fonctions particulières qui ont pu changer entre les différentes versions de PHP? Tu peux vérifier le changelog. Franchement je ne pense pas que ça vienne de la version de PHP ni du php.ini, mais tu peux vérifier, c'est rapide Smiley cligne

Côté code, tu es certaine d'avoir fait exactement la même séquence de test avec les mêmes lettres entre la prod et le local? Si non, peux tu retester? Si oui, place des debugs sur tes variables un peu partout pour voir pas à pas ce qu'il se passe. Quand tu utilises deux fois la même lettre dans le jeu, que se passe t-il?
Modifié par floreo (22 Dec 2013 - 23:00)
Modérateur
Salut j'ai regardé (et même testé) le code. Le moins que l'on puisse dire c'est que c'est rempli d'erreurs et que ça pète de partout. Difficile d'identifier le problème sans faire un bon nettoyage…

index.php L 10 : on supprime une variable de session (lettre) qui n'est définie nulle part ! (il y a bien un lettres )

index.php L 40 : impossible d'envoyer des headers après avoir envoyé du contenu, la redirection ne fonctionne donc pas. De toute façon je ne vois pas bien l'intérêt de tenter de faire un préchargement pour un traitement de 0.03 secondes en php …

pendu.php L 11 : faire un test sur $_GET est assez dangereux et risque de poser des problèmes: la bonne formulation serait if(isset($_GET['lettre']))

pendu.php L 19-22 : Là c'est jackpot, on commence par initialiser un paramètre en GET à l'aide d'une variable non-définie ($partie). Ensuit on teste si cette variable non définie contient 'new', et si c'est le cas (donc jamais) on efface une variable de session qui n'a jamais été définie (lettre au lieu de lettres ). Si l'objectif était de répondre à ?partie=new, de toute façon le lien qui a ce paramètre pointe sur l'autre fichier php…

pendu.php L 40 : $alphabet = range(a, z); => les constantes a et z ne sont pas définies, php les interptète comme 'a' et 'z' mais ce n'est pas très propre. => $alphabet = range('a', 'z');

pendu.php L 63-64 La variable $tablettres n'existe pas au premier chargement de la page…

En commençant par corriger ces problèmes ça permettra d'y voir plus clair. Ah, et toujours afficher (sur la page ou en log) les erreurs en développant et les corriger est d'une grande aide…
Floreo, j'ai appliqué la version 5.4 de PHP sur mon hébergement (comme en localhost) et je ne rencontre toujours aucun souci... Etrangement, en ligne, le doublement des entrées dans le var_dump ne se fait pas. Quand je tente la même suite de lettres que sur ma copie d'écran en ligne, je ne rencontre pas le souci de doublement non plus...


Grand merci pour ta correction, Kustolovic Smiley smile
J'ai bien dit que j'étais débutante... Je suis désolée de t'avoir donné de la besogne avec mon code qui "pète de partout" Smiley confused
Je vais analyser les erreurs que tu soulignes une par une, essayer de comprendre mes dérives et de ne plus les commettre.
C'est la première fois que je poste un de mes scripts dans son intégralité sur ce forum, et je suis contente d'avoir un retour exhaustif sur mon code, parce que je n'ai jamais été corrigée attentivement par qui que ce soit depuis que j'ai débuté en PHP.

En vrac, je réponds quand même à quelques uns de tes propos, sous forme d'affirmations ou de questions :

- Index L40... - la page index n'apparait certes qu'une seconde, mais il me semble que la redirection se passe sans problème ... du moins, chez moi Smiley sweatdrop ! J'ai mis mon script* en ligne pour que tu le constates (peut-être?) :
je conçois que le header n'a pas beaucoup d'intérêt ici, mais c'était une notion qu'on venait d'apprendre au cours... Je l'ai donc mise en pratique simplement pour me la rentrer dans le crâne Smiley cligne ...

- je vais peut-être poser une question super stupide mais... si $tablettres n'existe pas au premier chargement de la page et que je n'ai pas de warning, ça engendre quoi comme souci précisément? "Juste" un ralentissement, ou aussi d'autres problèmes?
Ha mais j'aurais peut-être eu un message en faisant en sorte d'avoir encore plus d'erreurs avec un wamp paramétré différemment, peut-être??

Je m'attelle à corriger les autres soucis dès demain.
Encore merci pour ta correction !

* mon script ne contient pas encore de session_destroy ni de suppression des fichiers texte qui se créent en cliquant sur les lettres (notamment !), ceci n'est pas un bug, c'est juste un script inachevé... Ce pendu me paraitra sans doute d'une facilité déconcertante à créer dans un an (je l'espère !), mais pour le moment, je rencontre encore beaucoup de difficultés.
Modifié par Reka (23 Dec 2013 - 21:56)
Modérateur
Reka a écrit :
- Index L40... - la page index n'apparait certes qu'une seconde, mais il me semble que la redirection se passe sans problème ... du moins, chez moi Smiley sweatdrop ! J'ai mis mon script* en ligne pour que tu le constates (peut-être?) :
je conçois que le header n'a pas beaucoup d'intérêt ici, mais c'était une notion qu'on venait d'apprendre au cours... Je l'ai donc mise en pratique simplement pour me la rentrer dans le crâne Smiley cligne ...

Dans le code que tu as fourni, la redirection ne fonctionne pas: http://marecages.be/alsa/index.html il n'y a aucune redirection (hormis un header refresh) mais qui ne devrait fonctionner car il doit être envoyé avant. À moins que tu aies activé la temporisation de l'envoi comme en ajoutant «php_flag output_buffering on» dans ton fichier .htaccess. Si c'est le cas c'est une assez mauvaise pratique car cela ralentira l'affichage de tes pages.
On pourrait tout faire sur une seule page mais sinon si tu souhaites garder la redirection le plus simple serait de faire tout simplement dans ton fichier index.php:

<?php
session_start();

if ($_SESSION['lettres']) {
  unset($_SESSION['lettres']);
}

$chances = 10;
$_SESSION['chances']= $chances;

$fichier = '10mots.txt';
$touslesmots = file($fichier);
shuffle($touslesmots);

$_SESSION['mot'] = $mot;

header('Redirect: pendu.php'); 



Reka a écrit :
- je vais peut-être poser une question super stupide mais... si $tablettres n'existe pas au premier chargement de la page et que je n'ai pas de warning, ça engendre quoi comme souci précisément? &quot;Juste&quot; un ralentissement, ou aussi d'autres problèmes?
Ha mais j'aurais peut-être eu un message en faisant en sorte d'avoir encore plus d'erreurs avec un wamp paramétré différemment, peut-être??

Une question n’est jamais stupide! En fait cela génère une Notice seulement, car php est un langage très laxiste, voici mon log sur mes tests d'hier:

[23-Dec-2013 00:04:09 Europe/Berlin] PHP Notice:  Undefined index: lettre in index.php on line 4
[23-Dec-2013 00:04:09 Europe/Berlin] PHP Warning:  Cannot modify header information - headers already sent by (output started at index.php:3) in index.php on line 36
[23-Dec-2013 00:23:40 Europe/Berlin] PHP Notice:  Undefined variable: partie in pendu.php on line 19
[23-Dec-2013 00:23:40 Europe/Berlin] PHP Notice:  Undefined variable: partie in pendu.php on line 20
[23-Dec-2013 00:23:40 Europe/Berlin] PHP Notice:  Use of undefined constant a - assumed 'a' in pendu.php on line 39
[23-Dec-2013 00:23:40 Europe/Berlin] PHP Notice:  Use of undefined constant z - assumed 'z' in pendu.php on line 39
[23-Dec-2013 00:23:40 Europe/Berlin] PHP Notice:  Undefined variable: lgtablettres in pendu.php on line 61
[23-Dec-2013 00:23:40 Europe/Berlin] PHP Notice:  Undefined variable: tablettres in pendu.php on line 61
[23-Dec-2013 00:23:40 Europe/Berlin] PHP Notice:  Undefined variable: tablettres in pendu.php on line 62

Lorsqu'on développe, il est important de bien afficher/consulter ces erreurs, elles permettent d'identifier ce genre de problèmes qui peuvent souvent provoquer des comportements étranges que l'on aura du mal à débugguer. En l'occurence $tablettres sera considéré comme NULL, et cela fonctionne pour le moment avec ton code. L’ennui est que ce genre d’effets inattendus pourra un jour ne plus fonctionner selon les changements que tu fais, ou sera moins compréhensible à la lecture.
Voici un exemple simple de correction qui ne provoquera pas d'erreurs et qui sera plus compréhensible:

// indication lettre choisie si le tableau de lettres jouées existe --------------
if (isset($tablettres)) {
    $dernierelettre = $tablettres[$lgtablettres - 1];
    echo '<p>Vous avez selectionné la lettre ' . $dernierelettre . '</p>';
    
    // verification si lettre choisie appartient au mot ------------------------------
    $lettreexiste = 0;

    for ($i = 0; $i < $lgmot; $i++) {
        if ($dernierelettre == $unite[$i]) {
            $lettreexiste = $lettreexiste + 1;
        }
    }
    echo 'La lettre apparaît ' . $lettreexiste . ' fois dans le mot à deviner...';

    // si lettre choisie appartient au mot, chances préservées ; sinon chances perdues ---           
    if ($lettreexiste == 0) {
        $_SESSION['chances']-=1;
        echo '<br>Il vous reste ' . $_SESSION['chances'] . ' coups avant la pendaison !';
    } else {
        echo '<br>Il vous reste ' . $_SESSION['chances'] . ' coups avant la pendaison !';
    }    
} else {
    echo '<p>Sélectionnez une lettre pour jouer</p>';
}


Reka a écrit :
Ce pendu me paraitra sans doute d'une facilité déconcertante à créer dans un an (je l'espère !), mais pour le moment, je rencontre encore beaucoup de difficultés.

sans doute ! Smiley cligne
Ok merci Smiley smile
Je prends note de tes remarques.
Je les enregistrerai dans ma caboche du mieux que je peux.

J'ai encore une ultime question :
ton log super détaillé, tu le récupères comment? C'est un machin à activer? Il faut un plugin spécifique intégré au navigateur?
Ca m'intéresserait de pouvoir développer avec les logs sous les yeux mais je ne vois pas comment les trouver.

Après cette question, j'arrête de vous ennuyer jusqu'à après les fêtes, c'est promis !
Donc, merci d'avance et d'ores et déjà : joyeuses fêtes de fin d'année Smiley smile
Les logs se trouvent côté serveur, en général dans /var/log/. Il faut que tu regardes du côté de ta configuration serveur web (virtualhost par exemple), la directive ErrorLog si tu as apache. Tu peux afficher pas mal d'erreur cependant dans ton script avec le display_errors à 1 et en activant les erreurs, regarde la et la pour plus de détails.
Bonnes fêtes à toi aussi Smiley smile
Modifié par floreo (23 Dec 2013 - 23:33)
Modérateur
Les logs, je ne sais pas comment les afficher sous Windows … Smiley confused

Mais cela n'affiche pas plus ou moins d'erreurs:
dans ton fichier php.ini tu as une ligne avec
error_reporting = …
qui permet de préciser le niveau d'erreurs que tu souhaites afficher. E_ALL permet de toutes les afficher. En développement, il est recommandé de configurer:
error_reporting = E_ALL

ensuite
display_errors = On (ou Off)
permet d'afficher ou non les erreurs sur ta page

log_errors = On (ou Off)
permet d'envoyer ou non les erreurs dans un log

et
error_log = "/Applications/MAMP/logs/php_error.log"
permet de spécifier le fichier (ou le programme) qui recevra les erreurs de log.

J’utilise des fichiers de logs que j'affiche dans ma console, mais tu peut tout aussi bien utiliser l‘affichage sur la page, ce qui compte c’est le niveau d'erreur à afficher, et qu'une des deux méthodes au moins soit activée.
Oups désolé je donnais le chemin des logs par défaut pour linux, après je me suis souvenu que tu utilisais WAMP >_<
Je n'ai pas Windows pour vérifier, mais si j'ai bonne mémoire, quand tu cliques sur l'icône de WAMP en bas à droite de la barre des tâches, tu cliques sur PHP, puis PHP error log, ça t'affichera les erreurs Smiley cligne