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 -
Sinistrus Messages postés 1010 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
Je sollicite votre aide sur ce bout de code :
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 ?
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 ?
A voir également:
- Rafraichissement de div
- Div c++ - Télécharger - Langages
- Remplacer #div/0 par vide ✓ - Forum Excel
- Ne pas afficher #DIV!0 sur une plage de cellu - Forum Bureautique
- Remplacer #div0 par le chiffre 0 - Forum Bureautique
- Bloquer rafraîchissement page chrome android - Forum Réseaux sociaux
4 réponses
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 ?
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 ?
jordane45
Messages postés
40050
Date d'inscription
Statut
Modérateur
Dernière intervention
4 759
Ah;. et aussi .. faudrait nous montrer la console de ton navigateur ( de préférence firefox pour debuguer l'ajax c'est mieux)
Bonjour Jordane,
Merci de l'intérêt que tu porte à mon poste.
index.php
_promo.php
Console sous firefox :
https://ibb.co/tCCsNGm
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
...
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
Et ensuite, dans ton fichier index :
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.
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.
$_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
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)
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
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