8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je cherche à réaliser un petit timer :

- Lorsque l'utilisateur arrive sur la page et qu'il entre une mauvaise réponse, le timer se déclenche, afin de l'empêcher de rentrer une autre réponse dans le laps de temps ;
- Le timer n'est pas réinitialisé sur reload de la page ou fermeture de la page.

J'imagine qu'il faut aller voir du côté d'une session PHP + javascript ?

Merci par avance pour votre aide !
Modifié par cyberlp23 (16 Mar 2018 - 12:09)
Modérateur
Bonjour!

Alors pour afficher un compteur qui s'incrémente sur la page (genre toute les secondes), il faut en effet du javascript.

ensuite il faut de la persistance: Une session php, un compte utilisateur + base de donnée, un cookie (ce qui peut être aussi uniquement javascript), du javascript localStorage ou sessionStorage. Il y a pas mal de choix, cela dépend de ce que tu souhaites par rapport à la durée, la maitrise (ou non) par l'utilisateur, etc.

Ensuite il suffit de sauvegarder dans le système choisi le timestamp de départ du timer.
Au chargement de la page, la différence entre cette valeur et le timestamp actuel te donnera le nombre de secondes écoulées pour initier le timer.
Lorsque tu ajoutes une minute, il suffit de diminuer la valeur sauvée de 60 secondes.
Merci pour ta réponse.
En fait ce que j'ai fait, c'est le code ci-après, qui fonctionne bien à un souci près.

L'idée donc c'est qu'il y a un formulaire avec un champ, dans lequel l'utilisateur entre sa réponse.
Si elle est correcte, tant mieux, il a gagné.
Si elle est incorrecte, un message d'erreur s'affiche. S'il rentre à nouveau une réponse incorrecte trop rapidement (ici en moins de 30 secondes), le formulaire ne s'affiche pas, avec à la place un compte à rebours lui disant : "Vous ne pourrez pas saisir de nouvelle réponse avant X secondes".

Tout cela fonctionne. Si jamais l'utilisateur rafraîchit en faisant F5, ça fonctionne toujours, mais s'il se contente de retaper l'URL, tout est réinitialisé. Il doit y avoir un problème dans la session PHP. Où est mon erreur ? Smiley smile

Merci par avance !



<?php
    if (!isset($time)) {
    session_start();
    $_SESSION['question_start'] = time();
    $time=$_SESSION['question_start'];
    }
?>

<?php if ($_POST['uname']=="bidule") { 
?><div class="time message"><?php echo $bravo; $reussite=1; ?></div>
<?php } 
if (isset($_POST['uname'])) { 
?><div class="time message">
    <?php
    echo $erreur; 
    $timediff = time() - $_POST['timer'];
  ?>
    </div>
<?php      } ?>

<?php if ($reussite != 1) { ?>
<div class="time">Entrer la réponse :</div>

<?php 
if ((isset($timediff)) && ($timediff < 30)) {
?>
<script>
var sTime = new Date().getTime();
var countDown = 120;

function UpdateTime() {
    $("#form").hide();
    var cTime = new Date().getTime();
    var diff = cTime - sTime;
    var seconds = countDown - Math.floor(diff / 1000);
    if (seconds >= 0) {
        var minutes = Math.floor(seconds / 60);
        seconds -= minutes * 60;
        $("#delai").html("<div style='padding:10px;'>Vous pourrez saisir une nouvelle réponse dans :<br/></div>");
        $("#minutes").html(minutes < 10 ? "0" + minutes : minutes);
        $("#seconds").html(seconds < 10 ? "0" + seconds : seconds);
     } else {
        $("#countdown").hide();
        $("#form").show();
        var compteur = 1;
        clearInterval(counter);
    }
}
UpdateTime();
var counter = setInterval(UpdateTime, 500);
</script>

<div id="countdown">
    <div id="delai" style="float:left"></div>
    <div id="minutes" style="float:left;">00</div>
    <div style="float:left; font-size:2em; line-height: 100%;">:</div>
    <div id="seconds" style="float:left;">00</div>
</div>

<?php } ?>

<div id="form">
<form id="form" method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
  <div id="input" class="container">
    <label><b></b></label>
    <input type="text" placeholder="" name="uname" maxlength="11">
    <input type="hidden" name="timer" value="<?=$time;?>">
    <button type="submit">OK</button>
  </div>
</form>
<br/>
 </div>

<?php  } ?>

Modifié par cyberlp23 (16 Mar 2018 - 12:00)
Salut,

Dans ton cas soit tu passes par un cookie pour l'avoir en dur, où alors tu passes par le "local storage"

Quand tu fais un F5 la session reste en place, mais si tu retapes l'URL tu recrée une nouvelle session du coup bas ça passe ...
Modérateur

<?php
    if (!isset($time)) {
    session_start();
    $_SESSION['question_start'] = time();
    $time=$_SESSION['question_start'];
    }
?>

Là ça réinitialise à chaque fois,

il faudrait:


<?php
    session_start();
    if (!isset($_SESSION['question_start'])) {
      $_SESSION['question_start'] = time();
    }
    $time=$_SESSION['question_start'];
?>
kustolovic a écrit :

il faudrait:

&lt;?php
    session_start();
    if (!isset($_SESSION['question_start'])) {
      $_SESSION['question_start'] = time();
    }
    $time=$_SESSION['question_start'];
?&gt;


J'ai l'impression que ça ne change rien Smiley decu
En effet peut-être faut-il un cookie ?
Modérateur
Ce n'est pas ça le problème, en fait avec cette différence tu stockes bien le temps (mais tu ne l'utilise pas pour faire quelque chose...

par exemple:



<?php
    session_start();
    if (!isset($_SESSION['question_start'])) {
      $_SESSION['question_start'] = time();
    }
    $time=$_SESSION['question_start'];
    $timediff = time() - $time;
?>