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

AJAX Discussion :

Soucis avec rafraichissement des données Ajax - PHP


Sujet :

AJAX

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Soucis avec rafraichissement des données Ajax - PHP
    Bonjour à tous,

    Le projet vise à faire un tableau d'affichage du classement de compétiteurs dans le cadre d'une course.
    J'ai une base de données en mysql qui stocke les participants, le nombre de tour, le temps par tour et le meilleur temps.
    Cette base est alimentée par une page php qui gère les passages des compétiteurs -> ca c'est ok. chaque passage est bien comptabilisé et la DB s'actualise.

    Le problème réside au niveau de la page d'affichage des résultats qui contient un tableau dynamique.
    La page est fixe et doit s'actualiser toutes les minutes.

    Au chargement initial c'est bon. J'ai un XMLhttprequest qui va rechercher les données via une requete sql contenue dans un fichier php.
    La ou ca bloque c'est lors des actualisations. Vu les logs de la console, je vois que XMLhttprequest est bien lancé mais en retour, au lieu d'avoir des données actualisées, j'ai les données initiales.... un peu comme si quelque part la requete sql du fichier php ne fonctionnait pas. Or je sais qu'elle fonctionne vu que lorsque je force l'actualisation de la page elle me donne les bonnes données.

    La où cela devient encore plus étrange, c'est que lorsque j'exécute le tout en local via Xampp cela tourne correctement et c'est lorsque j'exécute sur mon site en ligne que cela me fait ce bug... quelqu'un aurait une idée?

    code de la page:

    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
        <script>
    <!-- classement -->	
    		// initialisation
    	var equipes;
            var timerId;
            var updateInterval = 60000;	
    	var data
     
            // fetch data and store it in the variable data
            var xhReq = new XMLHttpRequest();
            xhReq.open("GET", "data.php",true);
            xhReq.send();
    		xhReq.onreadystatechange = function() {
    		if (this.readyState == 4 ) {
            data = JSON.parse(xhReq.responseText);
    		resetBoard();
            }
    };
     
            function descending(a, b) { return (a.tours < b.tours || (a.tours == b.tours && a.turntime > b.turntime)) ? 1 : -1; }
     
    		function reposition() {
                var height = $("#classement .equipe").height();
                var y = height;
                for(var i = 0; i < equipes.length; i++) {
                    equipes[i].$item.css("top", y + "px");
                    y += height;			
                }
            }  
            function updateRanks(equipes) {
    			var egal = 0
                for(var i = 0; i < equipes.length; i++) {
    			if (i>0){
    				if ((equipes[i-1].tours - equipes[i].tours)==0){
    				equipes[i].$item.find(".rank").text(egal);
    				} else {
    			    equipes[i].$item.find(".rank").text(egal+1);
    				egal = egal+1;				
    				}
    				}else {
    				equipes[i].$item.find(".rank").text(i + 1);
    				egal = i+1;
    				}
    			}
    		}
     
     
            function fetchNewData(data,attributeName,name){
                for(var x in data){
                    if((data[x].name == name) == true) {
                        return data[x][attributeName];
                    }
                }
                return null;
            }        
     
    		function time_convert(num) { 
    			var hours = Math.floor(num / 3600);  
    			var minutes = Math.floor((num - (hours * 3600)) / 60);
    			if (minutes <= 9) {
    			minutes = "0" + minutes;
    			}
    			var secondes = (num - (hours * 3600) - (minutes * 60));
    			if (secondes <= 9) {
    			secondes = "0" + secondes;
    			}
    			return hours + ":" + minutes + ":" + secondes;         
    }
            function getNewData(){
                // get the new data for each  and change to their new values
                var newReq = new XMLHttpRequest();
                newReq.open("GET", "data.php",true);
                newReq.send();
     
    			newReq.onreadystatechange = function() {
    			if (this.readyState == 4 ) {
                var newData = JSON.parse(newReq.responseText); 
    console.log(newData);
                for(var i = 0; i < equipes.length; i++) {
                    var equipe = equipes[i];
                    equipe.turntime = time_convert(fetchNewData(newData,'time_tour',equipe.name));
                    equipe.$item.find(".turntime").text(equipe.turntime);
                    equipe.bestturntime = time_convert(fetchNewData(newData,'best_time_tour',equipe.name));
                    equipe.$item.find(".bestturntime").text(equipe.bestturntime);
                    equipe.tours = fetchNewData(newData,'tours',equipe.name);
                    equipe.$item.find(".tours").text(equipe.tours);
                }
                equipes.sort(descending);
    			console.log(equipes);
                updateRanks(equipes);
                reposition();
     
    };
    };			
     
     
            }
     
     
            function resetBoard() {
                var $list = $("#classement");
                $list.find(".equipe").remove();
                if(timerId !== undefined) {
                    clearInterval(timerId);
                }
     
    	        equipes = [];
                for(let i = 0;i < 20;i++){
     
                    equipes.push(
                        {
                            name : data[i].name,
                            tours: data[i].tours,                        
                            turntime: time_convert(data[i].time_tour),
                            bestturntime: data[i].best_time_tour,
     
                        }
                    )
                }
     
                for(var i = 0; i < equipes.length; i++) {
                    var $item = $(
                        "<tr class='equipe'>" + 
                            "<th class='rank'>" + (i + 1) + "</th>" + 
                            "<td class='name'>" + equipes[i].name + "</td>" + 
                            "<td class='tours'>" + equipes[i].tours + "</td>" +
                            "<td class='turntime'>" + equipes[i].turntime + "</td>" + 
                            "<td class='bestturntime'>" + time_convert(equipes[i].bestturntime) + "</td>" + 
     
                        "</tr>"
                    );
     
                    equipes[i].$item = $item;
                    $list.append($item);
                }
                equipes.sort(descending);
                updateRanks(equipes);
                reposition();
     
                // fetch new data for the updateInterval
                timerId = setInterval("getNewData();", updateInterval);
     
            }	
     
        </script>

    Et voici la page php appelée:

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php header('content-Type:application/json'); 
     
     // connexion à la db */
     
    include("dbconnect.php");  
     
    // Si tout va bien, on peut continuer 
     
    $donnees = $bdd->query('SELECT id, name, tours, time_tour, best_time_tour FROM resultats ORDER BY id DESC ')->fetchAll(PDO::FETCH_ASSOC);
    $donnees = array_reverse($donnees);
     
    print json_encode($donnees);
     
            ?>

    merci d'avance pour votre aide

    Manu

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 76
    Points : 143
    Points
    143
    Par défaut
    Bonjour,
    Déjà ca m'as donné un mal de crane xD
    Si je me trompe pas il y a un problème de logique
    Primo j'ai jamais vu cette syntaxe la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    timerId = setInterval("getNewData();", updateInterval);
    Sur la doc c'est la function sans guillemets
    setInterval

    Deuxio tu fais pas de boucle pour mettre à jour ton contenu, a moins que j'ai loupé quelque chose
    Tu appel la fonction resetBoard() au chargement de ta page ,puis dedans tu set ton timeur à 1 min . Mais dès qu'il est executer c'est fini , nada , niete ,
    Fo que tu fasses une boucles , par exemple à la fin de updateRanks() quand tu as bien maj ton tableau tu appelles la fonction resetBoard comme ca toutes les minutes ca rafraichit à la fin de chaque actualisation ca remet un timer pour la prochaine actualisation

    Pour ton problème de base je sais pas trop quoi dire si ca fonctionne en local mais sur serveur , vérifie ta console côté serveur parce que tu me dis "je vois que XMLhttprequest est bien lancé" mais comment tu vois cela ?
    Ca peut être une histoire de différence de config mais ca aurait grogné et lacher un msg d'erreur , peut être une histoire de cache mais j'y crois pas trop

  3. #3
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour @gabi7756 et merci de t'être penché sur la question...

    set interval() accepte soit une fonction, soit un morceau de code. j'ai remarqué que lorsque je mettais juste la fonction, elle s'exécutait directement
    de même, setinterval me permets de me passer de boucle : cf dans le lien que tu as indiqué
    La méthode setInterval(), proposée sur les interfaces Window et WorkerGlobalScope, appelle à plusieurs reprises une fonction ou exécute un extrait de code, avec un délai fixe entre chaque appel.
    concernant le xmlhttprequest, je pense etre certain qu'il soit bien lancé vu que je demande de passer à la console les données reçues lorsque le test d'état est à 4:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var newReq = new XMLHttpRequest();
    newReq.open("GET", "data.php",true);
    newReq.send();
     
    newReq.onreadystatechange = function() {
    if (this.readyState == 4 ) {
    var newData = JSON.parse(newReq.responseText); 
    console.log(newData);
     
    ...
    donc en toute logique les données qu'il renvoie à la console sont celles qui viennent dêtre reçues et qui devraient être actualisées non?

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 76
    Points : 143
    Points
    143
    Par défaut
    Ok j'en apprend des trucs merci bien lol
    D'habitude j'utilise timeOut ...
    En toute logiquement oui les données dans la console devrait être les données actualisé ...

  5. #5
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 343
    Points : 697
    Points
    697
    Par défaut
    Citation Envoyé par manu010 Voir le message
    j'ai remarqué que lorsque je mettais juste la fonction, elle s'exécutait directement
    Il faut renseigner en paramètre uniquement le nom de la fonction sans parenthèse pour ne pas l'exécuter.
    Voir "Passer une fonction, mais sans l’exécuter" sur https://fr.javascript.info/settimeou...val#pa2vc4ax9m

    Le problème initial vient peut-être du cache http, à tester : https://developer.mozilla.org/fr/doc...asser_le_cache

  6. #6
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci à vous 2,

    je continue mes explorations... En diminuant la fréquence de rafraichissement, cela fonctionne...

    En local avec Xampp, j'actualise toutes les 10 secondes sans soucis.
    Sur mon site (je suis hébergé chez LWS), avec une actualisation toutes les 10 secondes, je vois bien que mon fichier php est lancé, mais il n'actualise pas les données.
    J'ai ralenti le taux de rafraichissement et lorsque je passe à une fréquence inférieure à la minute, ça fonctionne. .

    J'en viens donc à penser qu'il y a quelque part une limitation dans la frequence d'interrogation de la db.

    Manu

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 76
    Points : 143
    Points
    143
    Par défaut
    Ah mais t'es chez LWS, Jcrois bien qui ya une limite de rafraichissement , j'ai déjà été surpris par un rafraichissement lent ...
    Essaye de contacter le support vu que c'est gratuit , ca mange pas de pain et puis tu seras fixé comme ca
    Bon courage , tiens nous au courant si jamais ca te dérange pas

  8. #8
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    je viens de contacter LWS... et le nombre max d'interrogation de la DB mysql est de 600 000 par heure soit une moyenne de 166 par secondes et le nombre de connexion est de 240000 par heure donc 66/s.

    j'en suis bien loin avec mon interrogation toute les 10 secondes ;-) .

    Dans mon cas, avec un rafraichissement de l'affichage des résultats par minute c'est suffisant.

    Donc meme si cela me chipote de ne pas savoir ce qu'il se passe, je pense que je vais en rester là. Si jamais je trouve une explication / solution, je vous ferai un petit retour.

    bonne journée.

    Manu

  9. #9
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 433
    Points : 4 923
    Points
    4 923
    Par défaut
    Bonjour,

    Avez-vous essayé d'envoyer une nouvelle valeur de temps à chaque appelle ?
    xhReq.open("GET", "data.php?_=" + new Date().getTime(),true);.

    Puis utilisez le status 200 pour vous assurer que ce que vous recevez est une nouvelle copie de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (this.readyState == 4) {
         if (this.status == 200) { 
             // mettez la suite du code ici...
         }
    }

Discussions similaires

  1. Souci avec utilisation des constructeurs
    Par Khalfe dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 09/04/2020, 01h11
  2. Le code postal met à jour la liste des villes (Ajax/PHP)
    Par LadyArwen dans le forum Général JavaScript
    Réponses: 24
    Dernier message: 10/06/2010, 00h57
  3. rafraichissement des pages en php
    Par Stéph utilisateur d'acces dans le forum Débuter
    Réponses: 4
    Dernier message: 02/09/2009, 16h48
  4. souci avec lissage des ombres
    Par LastSpear dans le forum OpenGL
    Réponses: 2
    Dernier message: 28/06/2009, 14h59
  5. Gros souci avec gestion des arguments
    Par toams69 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 09/01/2009, 16h59

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