Partage
  • Partager sur Facebook
  • Partager sur Twitter

[JS] l'heure serveur, impossible ?

    17 octobre 2006 à 21:25:36

    Bonjour,
    Le problème suivant se pose sur mon site:
    Un compteur de temps javascript est mis en place, a la fin de celui-ci, le visiteur fini une mission.
    Problème:
    Certains visiteurs ont compris que le compteur fonctionnait avec l'heure local et s'amusent a tricher...
    Pour faciliter le travaille "anti-triche" des modos, je voudrais coriger ce problème...
    Est-ce possible ?
    Si oui, comment ?


    Merci d'avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      17 octobre 2006 à 21:29:40

      Salut,
      Tu peux toujours utiliser l'heure en PHP ;)
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        17 octobre 2006 à 21:33:53

        il suffit d'appeler ton fichier `truc.php` et de mettre tout ton code normale sauf à l'endroit ou tu veut l'heure du serveur :
        <?php date('d/m/Y H\hi'); ?>


        après tu peut remplacer 'd/m/Y H\hi' par le format de l'heure que tu veux (cf: les cours de matéo et la doc php)
        Et si tu ne trouve pas => demande le format sur le forum php ;)
        • Partager sur Facebook
        • Partager sur Twitter
          17 octobre 2006 à 21:53:56

          Je vais te proposer un truc qui ne doit pas être le plus simple mais qui te permettra d'utiliser le javascript:
          tu recupère le timestamp du serveur avec PHP tu le stock dans une variable javascript
          <?php echo '<sript typ="text/javascript"> var timestamp ='.time().';</scipt>'; ?>

          ensuite tu calcules le timstamp correspond à la fin de ta mission. Pour finir, tu fais une fonction javascript qui incrémente le timestamp toutes les secondes grace a setInterval(1000) ou un truc dans le genre et tu arrete quand le nouveau timestamp est egale ou sup au timestamp de fin.
          var fin = timestamp + 60; //fin dans une minute
          function increment()
          {
              if(timestamp >= fin)
              {   
                  fin_mission();
              }
              else
              {
                  timestamp++;
                  setInterval(increment, '1000');
              }
          }

          Le code ne marche sûrement pas mais l'idée y ai.
          J'essayerai de préciser et de corriger demain, là je suis trop crevé pour expliquer clairement.
          • Partager sur Facebook
          • Partager sur Twitter
            17 octobre 2006 à 22:15:09

            le pb, c'est que ya déjà du PHP XD
            Le timestamp est tiré de la base de données :euh:
            • Partager sur Facebook
            • Partager sur Twitter
              18 octobre 2006 à 13:08:55

              salut,
              incrémenter les timestamps en ajoutant des secondes comme ca n'est pas très propre, car au niveau des changements d'heure, ca ne marche pas.
              ensuite, pour répondre a S@suke, il ne faut jamais mettre de tâches critiques en javascript, sinon, forcément tout le monde va craquer ton jeu... tu dois tester absoluement tout retour, alors a mon avis, tu dois gérer la fin de mission sur le serveur, à la limite faire un appel/rafraichissement par javascript, mais changer ton marqueur/flag en BDD uniquement après avoir déterminé que sur le serveur que c'est bon (tu notes bien quand c'est fini, ou alors dans ta requête SQL tu utilises le timestamp de fin)

              en code ca donne :

              //timestamp server
              var RPG_initTimestampServer=new Date(<?php echo (mktime()*1000);?>);;
              var RPG_initTimer=new Date();
              //l'heure juste
              var RPG_servCurrTime;
              //une fonction
              function RPG_upHeure(){
                 var RPG_locTime=new Date();
                 RPG_servCurrTime=new Date(
                                       RPG_initTimestampServer.getHours()
                                     + (
                                           RPG_locTime.getHours()
                                         - RPG_initTimer.getHours()
                                       ),
                                     /* ... etc ...*/
                                     );
                 /*
                  * ici viennent les traitements
                  * lorsque tu atteint un nouveau
                  * temps limite
                  * qui idéalement sont gérés par
                  * des eventListeners, ou au moins
                  * un gestionnaire
                  ********************************/

                 RPG_callTimestampEvents( RPG_servCurrTime );
                 delete RPG_locTime;
              }
              setInterval(RPG_upHeure(),1000);


              et donc du côté de ton serveur :
              <?php
              /* le retour provoqué par le timer */
              if(mktime()>=$RPG_timestampFin){
                 //TU TRAITES
              }else{
                 //tu réécris la valeur de RPG_locTime et RPG_initTimer
              }
              ?>


              en théorie c'est sécurisé, à condition bien sur que tu te serves bien de variables de session, et ca doit marcher ^^
              • Partager sur Facebook
              • Partager sur Twitter
                18 octobre 2006 à 13:27:19

                en fait j'ai pas compris ton code :-°
                Mais le mien, c'est:
                <?php
                $rep = mysql_query ("SELECT mission, mission_code, mission_type FROM inscrits WHERE pseudo = '$pseudo'") or die (mysql_error());

                $data=mysql_fetch_assoc($rep);
                $mission=$data['mission'];
                $mission_code=$data['mission_code'];
                $mission_type=$data['mission_type'];

                $scjs1 = '<br /><div id="generals"><center><p><strong>Mission en cours :</strong></p></center><div id="missiontime"><center>Chargement...</center></div></div><br />    <script type="text/javascript">
                  v=new Date();
                  var bxx=document.getElementById(\'
                missiontime\');
                  function t(ss){
                    n=new Date();
                    s=ss-Math.round((n.getTime()-v.getTime())/1000.);
                    m=0;h=0;
                    if(s<0){
                      bxx.innerHTML=\'
                <center>Mission terminée !<br /><a href="prime.php?code='.$mission_code.'&typemission='.$mission_type.'">Recevoir sa Prime</a></center>\';
                    }else{
                      if(s>59){
                        m=Math.floor(s/60);
                        s=s-m*60
                      }
                      if(m>59){
                        h=Math.floor(m/60);
                        m=m-h*60
                      }
                      if(s<10){
                        s="0"+s
                      }
                      if(m<10){
                        m="0"+m
                      }
                      bxx.innerHTML=h+":"+m+":"+s+"  restant(s)<br />"
                    }
                    window.setTimeout("t(\'
                ';
                $scjs2 = '
                \');",999); //On change ici le temps voulu.
                  }
                  window.onload=t;
                </script>'
                ;


                $temps = time();
                if($temps >= $mission)
                {
                $tempsrestant = 0;
                }
                else
                {
                $tempsrestant = $mission - $temps;
                }
                echo $scjs1;
                echo $tempsrestant;
                echo $scjs2;
                ?>

                ^^
                (sisi, ça marche :p )
                mais en fait... le plus simple c'est de faire la vérif sur prime.php -_- (oui, je suis bête de ne pas y avoir pensé avant -_-')
                Enfin... si il y a une solution pour empêcher l'avancement du chrono, ça serait toujours mieux :p
                • Partager sur Facebook
                • Partager sur Twitter

                [JS] l'heure serveur, impossible ?

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown