Rafraichissement de div

Bonjour à tous,

Je sollicite votre aide sur ce bout de code :
<div id="promo_<?php echo $i; ?>"></div>

<script>
function loadLog(i) {
    var reference  = document.getElementById("txt_reference_" + i).value;
    $.ajax({
    type: "POST",
    url: "_promo.php",
    cache: false,
    data: {reference: reference},
    error: function (e) {console.log('Ajax Error', e);alert('Erreur Ajax');},
    success: function(html){
        $("#promo_" + i).html(html);
        setTimeout(loadLog(parseInt($("#promo_" + i).html(html))+1), 1000);
 }
    });
}

setTimeout(loadLog('<?php echo $i; ?>'), 1000);
</script>

<?php $i++;}}


Lors du chargement de ma page index.php, je récupère les données de _promo.php, sauf que l'actualisation ne se fait pas toutes les secondes.

_promo.php est bel et bien appelée au load et affiche les données de ladite page.
Chaque alerte qu'on a dû mettre affiche la référence que ce soit depuis la page d'appel ou la page appelée.
Donc au load, tout est ok, sauf que la boucle de 1 sec ne réponds pas.

Si je vide entièrement _promo.pho et met que "aaa" et charge index.php, il affiche "aaa"
Si je modifie "aaa" en "bbb", index reste "aaa" jusqu'au prochain load

Pouvez-vous m'aider svp ?

4 réponses

  1. $_SESSION_HANDLE est l'identifiant de l'utilisateur "connecté" : JA90710 par exemple.
    Cette valeur est sauvegardé aussi dans la session pour permettre à mes requête
    WHERE nic_handle = '".$_SESSION_HANDLE.'"
    de dire
    WHERE utilisateur = '".$mon_pseudo.'"
    .

    Je met en place ton code et je te reviens.

    Ce bout de code existe déjà dans mon fichier config.php (après la connexion à la DB)
    try
    	{
    	$pdo= new PDO('mysql:host='.MYSQL_HOST.';port='.MYSQL_PORT.';dbname='.MYSQL_BASE, MYSQL_USER, MYSQL_PASS);
    	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    	$pdo->exec("SET CHARACTER SET utf8");
    	}
    catch(PDOException $e){echo "<div class='alert alert-warning'>".$e->getMessage()."</div>"; die();}
    
    
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);
    


    Je n'ai jamais utilisé les fonctions que tu m'as donné. C'est une première, je vais étudier ça.
    Je te reviens sous peux
    1. Modérateur
      ...
      Le principe d'une fonction .. c'est qu'on a besoin de l'écrire qu'une seule fois... et ensuite on peut y faire appel lorsqu'on en a besoin..
      Là... comme je le craignais ... tu as mis autant de fois ta fonction qu'il y a de produits ... puisque tu l'as mis dans la boucle.

      De plus.. ton code gagnerait grandement en lisibilité si tu le découpais un peu plus en "fonctions" ( y compris dans le php..)

      Par exemple,
      Ton code pourrait ressembler à un truc du genre

      Dans ton fichier de connexion à ta bdd ( je suppose, config.php )
      Tu pourrais ajouter ces fonctions
      
      /* * ----------------------------------------------------------
       * FONCTIONS UTILES POUR MANIPULER LA BDD
       * ----------------------------------------------------------- */
      
      //Fonction permettant d'exécuter des requêtes préparées
      function dbQuery($sql, $datas) {
        global $pdo;
        try {
          $prep = $pdo->prepare($sql);
          return $prep->execute($datas);
        } catch (PDOException $e) {
          echo "Erreur : " . $e->getMessage();
        }
      }
      
      //permet de faire une requête SELECT et de retourner le premier jeu de résultat
      function db_One($sql, $datas = NULL) {
        $res = dbQuery($sql, $datas);
        return $res->fetch();
      }
      
      //permet de faire une requête SELECT et de retourner tous les résultats
      function db_All($sql, $datas = NULL) {
        $res = dbQuery($sql, $datas);
        return $res->fetchAll();
      }
      
      //Permet de faire une requête INSERT et de retourner l'id créé (si il est en auto-incrément bien entendu..)
      function db_Insert($sql, $datas = NULL) {
        global $pdo;
        $res = dbQuery($sql, $datas);
        return $pdo->lastInsertId();  //https://www.php.net/manual/fr/pdo.lastinsertid.php
      }
      


      Et ensuite, dans ton fichier index :
      <?php
      //affichage des erreurs PHP dans la page pour être sûr de ne rien laisser trainer...
      error_reporting(E_ALL);
      ini_set('display_errors', true);
      ini_set('display_startup_errors', true);
      
      //connexion à la BDD
      require_once($_SERVER['DOCUMENT_ROOT']."/includes/config.php");
      
      
      
      $nbr_prod = null;
      $g_total = null;
      $g_livraison = null;
      
      function getProducts($_SESSION_HANDLE) {
      
        $sql = "SELECT 
                  S.id
                 ,S.nic_handle
                 ,S.reference
                 ,S.quantite
      
                 ,P.image_1
                 ,P.categorie
                 ,P.souscategorie
                 ,P.reference
                 ,P.libelle
                 ,P.description
                 ,P.montant
                 ,P.taux_reduction
                 ,P.fin_promo
                 ,P.montant_livraison
                 ,P.statut
                 ,P.short_link
                 ,P.hits
                 ,P.aime
                 ,P.stock
                 ,P.achete
                 ,P.style
                 ,P.plateau
                 ,P.materiaux
                 ,P.bordures
                 ,P.type_pieds
                 ,P.materiaux_pieds
                 ,P.longueur
                 ,P.largeur
                 ,P.hauteur
                 ,P.epaisseur
                 ,P.poids
                 ,P.nombre_places
                 ,P.assemblage
                 ,P.modele_unique
                 ,P.eclairage
                 ,P.cable
                 ,P.prise
                 ,P.fait_main
                 ,P.couleurs
                FROM tab_shop_produits S
                LEFT JOIN tab_produits P ON P.reference = S.reference
                WHERE S.nic_handle = :nic_handle ORDER BY S.id ";
        $datas = [':nic_handle'=>$_SESSION_HANDLE];
        return db_All($sql, $datas); //retourne le resultat sous la forme d'un array
      }
      
      /**
       * Retourne le nombre de produits
       */
      function getNbProducts($_SESSION_HANDLE){
        $sql = "SELECT COUNT(reference) AS NB 
                FROM tab_shop_produits 
                WHERE nic_handle = :nic_handle ";
        $datas = [':nic_handle'=>$_SESSION_HANDLE];
        $res = db_One($sql, $datas); //retourne le resultat sous la forme d'un array
        return !empty($re['NB']) ? $re['NB'] : 0;
      }
      
      
      $stat = getProducts($_SESSION_HANDLE);
      $nbr_prod = getNbProducts($_SESSION_HANDLE);
      
      foreach($stat as $data) {
          $id = $data["id"];
          $reference = $data["reference"];
          $libelle = $data["libelle"];
          $stock = $data["stock"];
          $poids = $data["poids"];
          $quantite = $data["quantite"];
          $short_link = $data["short_link"];
          $eclairage =$data["eclairage"] == 0 ? "Non" : $data["eclairage"] . " Watt";
          
          ?>
      
          <div class="card mb-2">
            <div class="card-header p-2">
              <div class="row">
                <div class="col-md-2">
                  <img class="img-fluid mb-2" src="/ew-content/images/produits/<?php echo $reference; ?>/<?php echo $reference; ?>-1.png">
                  <div class="text-center"><a class="btn btn-sm text-danger" href="#"><i class="fal fa-trash"></i></a></div>
                </div>
                <div class="col-md-10">
                  <div class="mb-2">
                    <a class="text-dark text-decoration-none" href="/<?php echo $short_link; ?>" target="_blank"><?php echo $libelle; ?></a>
                  </div>
          <?php include("_descriptions.php"); ?>
      
      
                  <?php
                 
      
                  $montant = $data["montant"];
                  $taux = $data["taux_reduction"];
                  $reduction = $montant * (1 - $taux / 100);
      
                  $livraison = $data["montant_livraison"];
                  $total = $montant + $livraison;
      
                  $g_total += $montant;
                  $g_livraison += $livraison;
      
                  $stock = $data["stock"];
                  $economi = $montant - $reduction;
                  if ($livraison == 0) {
                    $livraison = "<span class='text-success mb-2'>GRATUIT</span>";
                  } else {
                    $livraison = number_format($livraison, 0, ',', ' ') . " FCFA";
                  }
                  if ($g_livraison == 0) {
                    $n_livraison = "<span class='text-success mb-2'>GRATUIT</span>";
                  } else {
                    $n_livraison = number_format($g_livraison, 0, ',', ' ') . " FCFA";
                  }
                  ?>
                  <div id="promo_<?php echo $id; ?>" class="js-promos"  data-id="<?php echo $id ;?>" ></div>
                  <input type="hidden" id="txt_reference_<?php echo $id; ?>" value="<?php echo $reference; ?>">
                  <div class="clearfix">
                  </div>
                  <div class="fw-bold mb-0 text-end small"><?php echo number_format($montant, 0, ',', ' '); ?> FCFA</div>
                  <div class="mb-0 text-end small"><?php echo $livraison; ?></div>
                  <div class="mb-0 text-end small"><?php echo number_format($total, 0, ',', ' '); ?> FCFA</div>
      
      
                </div>
              </div>
      
      
            </div>
          </div>
      
      
        
      
          <?php
         
      } // fin du foreach
      ?>
      <!-- SCRIPT EN DEHORS DE LA BOUCLE !!  -->
        <script>
            function loadLog(id) {
              var reference = document.getElementById("txt_reference_" + id).value;
              $.ajax({
                type: "POST",
                url: "_promo.php",
                cache: false,
                data: {reference: reference},
                error: function (e) {
                  console.log('Ajax Error', e);
                  alert('Erreur Ajax');
                },
                success: function (html) {
                  $("#promo_" + i).html(html);
                  setTimeout(loadLog(parseInt($("#promo_" + id).html(html)) + 1), 1000);
                }
              });
            }
            
            //on déclenche pour chaque élément ayant la class js-promos
            $(".js-promos").each(function(i,el){
              let id = $(this).data('id');
              setTimeout(loadLog(id), 1000);
            });
      </script>
      


      NB: Par contre, je ne sais pas d'où tu sors ta variable $_SESSION_HANDLE ... à toi de remettre le début de ton script que tu ne nous a pas montré.

      NB² : Les fonctions php, getProducts, getNbProducts .. sont à mettre AVANT le HTML de préférence .... pas en plein milieu du code.
      1. Bonjour Jordane,

        Merci de l'intérêt que tu porte à mon poste.

        index.php
        <?php
        $nbr_prod = null;
        $g_total = null;
        $g_livraison = null;
        
        try {
                $stat = $pdo->query( "
                            SELECT 
                             S.id
                            ,S.nic_handle
                            ,S.reference
                            ,S.quantite
        
        					,P.image_1
        					,P.categorie
        					,P.souscategorie
        					,P.reference
        					,P.libelle
        					,P.description
        					,P.montant
        					,P.taux_reduction
        					,P.fin_promo
        					,P.montant_livraison
        					,P.statut
        					,P.short_link
        					,P.hits
        					,P.aime
        					,P.stock
        					,P.achete
        					,P.style
        					,P.plateau
        					,P.materiaux
        					,P.bordures
        					,P.type_pieds
        					,P.materiaux_pieds
        					,P.longueur
        					,P.largeur
        					,P.hauteur
        					,P.epaisseur
        					,P.poids
        					,P.nombre_places
        					,P.assemblage
        					,P.modele_unique
        					,P.eclairage
        					,P.cable
        					,P.prise
        					,P.fait_main
        					,P.couleurs
        
                            FROM tab_shop_produits S
        
                            LEFT JOIN tab_produits P ON P.reference = S.reference
        
                            WHERE S.nic_handle = '".$_SESSION_HANDLE."' ORDER BY S.id");
                $i = 0;
                while ($data = $stat->fetch( PDO::FETCH_ASSOC)) {
                    $id = $data["id"];
                    $reference = $data["reference"];
                    $libelle = $data["libelle"];
                    $stock = $data["stock"];
                    $poids = $data["poids"];
                    $quantite = $data["quantite"];
        			$short_link = $data["short_link"];
        			
        			if($data["eclairage"] == 0) {$eclairage = "Non";} else {$eclairage = $data["eclairage"]." Watt";}
        ?>
        
        		<div class="card mb-2">
        			<div class="card-header p-2">
        				<div class="row">
        					<div class="col-md-2">
        						<img class="img-fluid mb-2" src="/ew-content/images/produits/<?php echo $reference; ?>/<?php echo $reference; ?>-1.png">
        						<div class="text-center"><a class="btn btn-sm text-danger" href="#"><i class="fal fa-trash"></i></a></div>
        					</div>
        					<div class="col-md-10">
        						<div class="mb-2">
        							<a class="text-dark text-decoration-none" href="/<?php echo $short_link; ?>" target="_blank"><?php echo $libelle; ?></a>
        						</div>
        						<?php include("_descriptions.php"); ?>
        
        						
        <?php
        $nbr_prod	= $pdo->query("SELECT COUNT(reference) FROM tab_shop_produits WHERE nic_handle = '".$_SESSION_HANDLE."' ")->fetchColumn();
        			
        $montant	= $data["montant"];
        $taux		= $data["taux_reduction"];
        $reduction 	= $montant * (1 - $taux / 100);
        
        $livraison 	= $data["montant_livraison"];
        $total 		= $montant + $livraison;
        			
        $g_total 		+= $montant;
        $g_livraison 	+= $livraison;
        
        $stock 		= $data["stock"];
        $economi	= $montant - $reduction;
        if($livraison == 0) {$livraison = "<span class='text-success mb-2'>GRATUIT</span>";} else {$livraison = number_format($livraison,0,',',' ')." FCFA";}
        if($g_livraison == 0) {$n_livraison = "<span class='text-success mb-2'>GRATUIT</span>";} else {$n_livraison = number_format($g_livraison,0,',',' ')." FCFA";}
        ?>
        
        						
        <div id="promo_<?php echo $i; ?>"></div>
        						
        <input type="hidden-" id="txt_reference_<?php echo $i; ?>" value="<?php echo $reference; ?>">
        
        						
        <div class="clearfix">
        						
        </div>
        						<div class="fw-bold mb-0 text-end small"><?php echo number_format($montant,0,',',' '); ?> FCFA</div>
        						<div class="mb-0 text-end small"><?php echo $livraison; ?></div>
        						<div class="mb-0 text-end small"><?php echo number_format($total,0,',',' '); ?> FCFA</div>
        
        						
        					</div>
        				</div>
        				
        				
        			</div>
        		</div>
        
        
        <script>
        function loadLog(i) {
            var reference 	= document.getElementById("txt_reference_" + i).value;
            $.ajax({
            type: "POST",
            url: "_promo.php",
            cache: false,
            data: {reference: reference},
            error: function (e) {console.log('Ajax Error', e);alert('Erreur Ajax');},
            success: function(html){
        		$("#promo_" + i).html(html);
        		setTimeout(loadLog(parseInt($("#promo_" + i).html(html))+1), 1000);
        	}
            });
        }	
        	setTimeout(loadLog('<?php echo $i; ?>'), 1000);
        </script>
        
        <?php $i++;}} catch(PDOException $e){echo "<div class='alert alert-danger'>".$e->getMessage()."</div>";} ?>


        _promo.php
        <?php
        require_once($_SERVER['DOCUMENT_ROOT']."/includes/config.php");
        if(isset($_POST["reference"])) {
        	
        $stat = $pdo->query( "SELECT fin_promo FROM tab_produits WHERE reference = '".$_POST["reference"]."' ");
                while ($pro = $stat->fetch( PDO::FETCH_ASSOC)) {
        			$fin_promo 	= $pro["fin_promo"];
        			
        if(!empty($fin_promo) AND $fin_promo > date("Y-m-d H:i:s")){
        $date1 		= strtotime("now"); 
        $date2 		= strtotime($fin_promo);
        $diff 		= abs($date2 - $date1);
        $years 		= floor($diff / (365*60*60*24));
        $months 	= floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
        $days 		= floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
        $hours 		= floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24) / (60*60)); 
        $minutes 	= floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60)/ 60); 
        $seconds 	= floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minutes*60)); 
        	
        if($months == 0) {$mois = null;}
        if($months >= 1) {$mois = $mois." mois, ";}
        
        if($days == 0) {$jour = null;}
        if($days == 1) {$jour = $days." jour, ";}
        if($days >= 2) {$jour = $days." jours, ";}
        
        if($hours == 0) {$heure = null;}
        if($hours == 1) {$heure = $hours." heure, ";}
        if($hours >= 2) {$heure = $hours." heures, ";}
        	
        if($minutes == 0) {$minute = null;}
        if($minutes == 1) {$minute = $minutes." minute";}
        if($minutes >= 2) {$minute = $minutes." minutes";}
        	
        if($seconds == 0) {$seconde = null;}
        if($seconds == 1) {$seconde = " et ".$seconds." seconde";}
        if($seconds >= 2) {$seconde = " et ".$seconds." secondes";}
        
        $promo = "<div id='promo' class='mb-2 text-end small text-success blink_'>La promo se termine dans ".$mois.$jour.$heure.$minute.$seconde."</div>";
        	} else {
        $promo = null;
        }
        		}
        	echo $promo;
        }


        Console sous firefox :
        https://ibb.co/tCCsNGm
        1. Modérateur
          Bonjour,

          J'ai l'impression que ton code se trouve dans une boucle ... et ... ben.. faut pas !

          Peux tu nous montrer le code complet de ta page ... ainsi que le code généré de celle-ci ?

          1. Modérateur
            Ah;. et aussi .. faudrait nous montrer la console de ton navigateur ( de préférence firefox pour debuguer l'ajax c'est mieux)