Un Compte à rebours «perpétuel» !

Résolu/Fermé
Sunijech Messages postés 9 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 28 octobre 2016 - 28 oct. 2016 à 18:47
 sunijech - 31 oct. 2016 à 19:57
Bonjour !
Existe-t-il un compte à rebours «perpétuel», c. à d. qui commencerait le décompte à l'ouverture d'une page web, pour une période prédéterminée, sans prendre en compte une ou des dates spécifiques ? À l'expiration de cette période, le visiteur qui aurait consulté cette page web n'y aurait plus accès mais serait dirigé vers une autre page...
En fait, je cherche un moyen de permettre à un visiteur de bénéficier d'un tarif spécial pendant un relativement court laps de temps, et cela dès qu'il s'informe des prix et conditions ! Par la suite, il aurait seulement accès à la page des tarifs normaux.
Souhaitant ma question suffisamment claire et dans l'attente de votre réponse, je vous adresse mes salutations les plus cordiales.
Philippe L.
A voir également:

3 réponses

codeurh24 Messages postés 761 Date d'inscription samedi 29 mars 2014 Statut Membre Dernière intervention 8 septembre 2018 123
Modifié par codeurh24 le 29/10/2016 à 10:10
Bonjour. Faudra supprimer les echo avant le html mais je les laisses pour la compréhension.
<?php session_start();
 header('Content-Type: text/html; charset=utf-8');
 
 
 // donne un certain temps avant la fin de la promotion
 $delais = 60;
 // simplifie et initialise la variable ip
 $adresseIP = $_SERVER['REMOTE_ADDR'];
 // donne un sens au timestamp recuperé
 $dateActuelle = time ();
 
 
 // si le fichier json n'existe pas on le créer
 if(! file_exists ( 'promo-deja-vue.json') )
 {
   $fp = fopen('promo-deja-vue.json', 'w');
   fwrite($fp, '' );
   fclose($fp);
 }
 
 
 if (! isset($_SESSION["$adresseIP"]) ){
  // une fois le fichier json creer on l'exploite
  // tableau vide prevu pour y mettre toute les adresses ip deja connu dans le fichier json
  $ipListe = array() ;
  // recupere d'un coup toutes les données du fichier json
  $donnees_brutes = file_get_contents('promo-deja-vue.json');
  // convertir les données json en tabeau php vers le tableau qui etait vide
  // maintenant il est remplis de toute les adresses ip précedement connus
  $ipListe = json_decode( $donnees_brutes, true );
  
  // verifie si l'ip du visiteur est dans le tableau ipListe.
  if( $ipListe ? array_key_exists( $adresseIP ,$ipListe ) : false )
  {
   // recree la varaible de session qui a ete oublier lors de la femeture du navigateur
   // ou si le visiteur a utilisé un autre navigateur
   $_SESSION["$adresseIP"] = $ipListe["$adresseIP"];
   echo "adresse ip deja utilisé ".$adresseIP."<br />";;
  }else{
   echo "adresse ip inexistante"."<br />";;
   // on memorise l'adresse ip pour ne pas tricher avec un autre navigateur
   // ou une prochaine re-visite
   $ipListe["$adresseIP"] = time ();
   $fp = fopen('promo-deja-vue.json', 'w+');
    fwrite($fp, json_encode($ipListe) );
   fclose($fp);
   
  }
 }else{
  echo "adresse ip deja utilisé ".$adresseIP."<br />";;
 }
 
 
  
 
 
 // si l'adresse ip n'as pas éte mémorisé en varaible de session ou depuis json
 if (! isset($_SESSION["$adresseIP"]) ){
  // alors on memorise pour la premiere fois l'ip avec un timestamp
  $_SESSION["$adresseIP"] = time () ;
  $tempsRestentEpuise =  $delais;
  $page_promo = true; // on accorde le droit de voir la page promo
 }else{ // sinon l'ip a déjà été utilisée
  
  // on verifie depuis combien de secondes
  // si ça fait au moins 60s
  if( ($dateActuelle - $_SESSION["$adresseIP"] ) >= $delais   ){
   // alors on refuse d'afficher la page des promos
   echo "Depuis ".($dateActuelle - $_SESSION["$adresseIP"] )." secondes<br />";
   $page_promo = false;
  }else{ // sinon c'est bon, on autorise
   $tempsRestentEpuise =  $delais  - ($dateActuelle - $_SESSION["$adresseIP"] );
   $page_promo = true;
  }
 }
 
 // autorise ou pas la bonne page
 if ($page_promo) {
?>
  <!DOCTYPE html>
  <html>
  <head>
   <title>Page promo</title>
    <meta http-equiv="refresh" content="<?php echo $tempsRestentEpuise; ?>"> 
   <script type="text/javascript" src="http://code.jquery.com/jquery-3.1.1.min.js"></script>
  </head>
  <body>
   <div id="conteneur" style="background-color:#FF0">
   <div>Voici les super promo du jour mais attention</div>
   <div>
    il vous reste seulement 
    <span id="tempsRestent"><?php echo $tempsRestentEpuise; ?></span> seconde
   </div>
   </div>
   <script>
   var compteur = <?php echo $tempsRestentEpuise; ?>;
   $( "#tempsRestent" ).text(compteur);
   setInterval(function(){ 
    compteur--;
    $( "#tempsRestent" ).text(compteur);
    if( compteur < 1 ){
     window.location.href= window.location.href;
    }
   }, 1000);
   </script>
  </body>
  </html>
<?php

 }else{
?>
  <!DOCTYPE html>
  <html>
  <head>
   <title>Page normale</title>
  </head>
  <body>
   <div>Page normale</div>
  </body>
  </html>
<?php
 }

?>
2
gardiendelanuit Messages postés 1769 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 19 novembre 2016 264
Modifié par gardiendelanuit le 28/10/2016 à 23:04
Bonjour,

C'est en effet possible par plusieurs moyens.

Le plus simple consiste à utiliser JavaScript côté client et démarrer un setTimeout avec la valeur de temps correspondante.
La période écoulée, la fonction de callback passée en paramètre serait appelée et aurait pour action de rediriger le navigateur sur une page déterminée.

Il faudrait également un appel à un processus de sauvegarde côté serveur lors de l'appel à la page de redirection de façon à ne plus proposer cette exception au client par la suite.

Un exemple simple hors contexte:

/* 
Redirige au bout de 30s vers someNewPage.php, contenant un script de stockage du passage du client en session en plus de l'affichage.
*/
(function(){
    setTimeout(function(){
        window.location = '/someNewPage.php'; 
    }, 30000);
})();



Il est à noter que cette méthode ne garantie pas complètement des fraudes (le client peut toujours désactiver javascript ou pour peu qu'il sache comment cela fonctionne, modifier le code avec le devTool navigateur).

La parade consiste alors à faire un système similaire en parallèle côté serveur:
1. Lorsque la première page est appelée, on stock le temps actuel (avec time() dans une variable session.
2. Lors de l'appel à la page de promo, on vérifie alors si une telle variable existe et si oui, si elle a dépassé une période donnée:

<?php
session_start(); // On oublie pas de démarrer la session avant tout autre code!
$_SESSION['promoConsultedOn'] = time(); // temps UNIX en milliseconde
// ...


Sur l'autre page, il suffit alors de regarder si existant et non dépassé:

<?php
session_start();

if(isset($_SESSION['promoConsultedOn'])){
    $elapsedTime = time() - $_SESSION['promoConsultedOn'];
    if($elapsedTime > 30000) // 30 secondes
        header('Location: /tarifNormaux.php', true, 301);
}

// ...


Encore une fois ici, celà ne marchera que si le navigateur reste ouvert entre temps!
Pour aller plus loin il faudra probablement penser aux cookies et même jusqu'à stocker l'IP du client en base de données...

Merci de mettre "Résolu" quand le problème est réglé!
La connaissance c'est comme la confiture: moins on en a et plus on l'étale.
1
Konseil Messages postés 643 Date d'inscription samedi 29 août 2015 Statut Membre Dernière intervention 13 novembre 2018 427
28 oct. 2016 à 22:49
Dans le même genre:
 <meta http-equiv="refresh" content="30" URL="http://redirection.com"> 
0
Formidable ! Vous êtes d'une générosité incroyable... Cependant, vous me plongez dans l'embarras le plus piteux qui soit ! Je n'avais pas compris que ma demande allait faire appel à des compétences qui dépassent de très loin mes propres connaissances ! À tel point que je ne sais pas comment utiliser les conseils et les infos (que je devine très pertinents) que vous avez la bonté de me donner. Je crois que je vais devoir me limiter à mon maigre savoir et orienter mes pages et mes visiteurs d'une autre façon, ce que je ne cesse de faire depuis que je me suis lancé dans cette aventure !
Je tiens à vous manifester ma grande reconnaissance et mes vifs remerciements.
Très cordialement. Philippe L.
0