Rafraichissement de div

Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   -  
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   -
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. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
     
    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 ?

    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
       
      Ah;. et aussi .. faudrait nous montrer la console de ton navigateur ( de préférence firefox pour debuguer l'ajax c'est mieux)
      0
  2. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
     
    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
    0
  3. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
     
    ...
    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.
    0
  4. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
     
    $_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
    0