Rafraichissement de div

Fermé
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 - Modifié le 19 mai 2022 à 18:43
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 - 20 mai 2022 à 11:23
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

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
19 mai 2022 à 19:07
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
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
19 mai 2022 à 19:07
Ah;. et aussi .. faudrait nous montrer la console de ton navigateur ( de préférence firefox pour debuguer l'ajax c'est mieux)
0
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
20 mai 2022 à 01:20
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
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
20 mai 2022 à 10:20
...
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
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
20 mai 2022 à 11:23
$_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