IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Boucle For Javascript


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Boucle For Javascript
    Bonjour tout le monde !

    Je rencontre une difficulté avec le morceau de code suivant, j'affiche a un endroit une somme de nombre récupéré dans ma BDD. Cela fonctionne le probleme que je rencontre c'est que tous les nombres défilent à l'écran car mon "document.getElementById('nbr_page').innerHTML = nombre_fiche;" est à l'intérieur de la boucle for... mais quand je le sort de la boucle cela ne fonctionne plus ... j'imagine que ca va être très simple à résoudre pour quelqu'un qui connait JS mais je m'y casse les dents depuis des heures ...

    Pour résumer j'aimerais affiché uniquement le nombre final et pas tous les nombres jusqu'a arrivé a la somme complète... J'espere avoir été clair ...



    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function calcul_nbr_page() 
    {
    	var x;
    	var nombre_fiche=0;
    	for (x = 1; x < 21; x++) 
    	{
    		var val_fiche;
    		if (document.getElementById('select_fiche_'+x) != null)
    		{
    			val_fiche= document.getElementById('select_fiche_'+x).value;
    			$.ajax({
    				type:"POST",
    				url:"js/ajax/nbr_fiche_recup.php",
    				data:"id_fiche=" + val_fiche,
    				success:function(data)
    				{
    					nombre_fiche = nombre_fiche + parseInt(data);
    					document.getElementById('nbr_page').innerHTML = nombre_fiche;
    				}
    			})
    		}
    	}
    }

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 638
    Points : 66 668
    Points
    66 668
    Billets dans le blog
    1
    Par défaut
    pourquoi la boucle for à ce moment là ?

    Passe les bornes à to ajax
    fait le traitement et la somme coté serveur, et ne retourne qu'une seule valeur ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    La boucle For me permet de récupérer les valeur de plusieurs select et j'ai une autre fonction qui me permet d'ajouter des select. Du coup je vois pas comment faire en 1 seule fois si je sais pas a l'avance les identifier.

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    C’est pas si évident que ça en a l’air. Il faut que ton code agisse lorsque toutes les requêtes ajax ont terminé. Or, tu ne sais pas dans quel ordre elles vont aboutir, donc tu ne peux pas savoir quelle sera la « dernière ».

    Bien sûr, SpaceFrog pose une bonne question : est-il vraiment nécessaire de faire plusieurs requêtes ajax ? Si tu as moyen de modifier le code serveur pour ne faire qu’une requête, c’est l’idéal.

    Sinon, tu peux utiliser Promise.all() qui te permet d’attendre la fin de toutes les requêtes. Les objets ajax de jQuery sont compatibles avec les promesses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    function calcul_nbr_page() 
    {
    	"use strict";
    	const lesRequetes = [];
    	for (let x = 1; x < 21; x++) 
    	{
    		const elem_x = document.getElementById('select_fiche_' + x);
    		if (elem_x !== null)
    		{
    			lesRequetes.push(
    				$.ajax({
    					method: "POST",
    					url: "js/ajax/nbr_fiche_recup.php",
    					data: "id_fiche=" + elem_x.value,
    				})
    			);
    		}
    	}
     
    	let nombre_fiche = 0;
    	Promise.all(lesRequetes).then(function (resultats)
    	{
    		for (const data of resultats)
    		{
    			nombre_fiche = nombre_fiche + parseInt(data);
    		}
    		document.getElementById('nbr_page').textContent = nombre_fiche;
    	});
    }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    si j'ai bien compris SpaceFrog, l'idée est de :
    • 1- via la boucle : "récolter" tous les id_fiche (dans un array JS, ou une variable JS de la forme "id1-id13-id25-...")
    • 2- APRES la boucle : faire UN SEUL appel Ajax, en transmettant TOUS les id_fiche.
    • 3- dans le fichier PHP appelé : boucler (en PHP) * sur les id_fiche, faire l'addition, et renvoyer le total
    • 4- en JS : afficher ce total


    * Eventuellement (on ne sait pas comment tu récupère le nombre de page dans la BDD) -> mais on peut envisager de récupérer la SOMME directment via une requête SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT SUM(nombre_pages) FROM ..... WHERE id_fiche IN (...,...,...,...) "



    [EDIT] Ce n'est pas le même principe qu'énoncé par Watilin.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Ok merci jreaux62 j'avais pas compris ca en lisant le message de SpaceFrog, oui j'y avais pas pensé, je vais essayer le coup du Array JS. Un Array ca se passe de la même manière qu'une variable simple ?

    Parcontre désolé Watilin j'ai pas compris ta proposition

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Punaise j'étais content avec la technique du passage de Array j'ai cru que ca marchait mais finalement si je sélectionne deux fois le meme élément dans 2 select ca ne s'ajoute pas !

    Du coup je vais décomposer et faire plusieurs requêtes coté serveur... Sauf s'il y a encore une solution que je n'ai pas vu !

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jul13s Voir le message
    ...si je sélectionne deux fois le meme élément dans 2 select...
    Ça, tu n'en as jamais parlé !
    A toi de nous donner les bonnes infos !!

    D'autres part, je ne vois pas forcément en quoi c'est un "problème" : il suffit certainement d'adapter le code PHP... (mais comme tu ne montres AUCUN code...)

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 8
    Points
    8
    Par défaut




    C'est pas grave si la requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(nombre_pages) FROM fiches WHERE id_fiche IN (1,2,1,3)
    ne marche pas je vais décomposer coté PHP, ça je sais faire ! Merci beaucoup à tous les trois en tout cas.

  10. #10
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 638
    Points : 66 668
    Points
    66 668
    Billets dans le blog
    1
    Par défaut
    Filtre ton array pour enlever les doublons ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  11. #11
    Invité
    Invité(e)
    Par défaut
    @spacefrog
    Non. C'est le contraire : il veut pouvoir avoir plusieurs fois le même id.

  12. #12
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 638
    Points : 66 668
    Points
    66 668
    Billets dans le blog
    1
    Par défaut
    En effet je n' l'avais pas vu sous cet angle ...
    du coup une requête par id, tu comptes les doublons et tu multiplies ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  13. #13
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par jul13s Voir le message
    C'est pas grave si la requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(nombre_pages) FROM fiches WHERE id_fiche IN (1,2,1,3)
    ne marche pas je vais décomposer coté PHP, ça je sais faire ! Merci beaucoup à tous les trois en tout cas.
    De rien

    On sort un peu du sujet mais j’aime bien les défis SQL Tu peux utiliser une table temporaire :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TEMPORARY TABLE temp_ids (num BIGINT UNSIGNED NOT NULL);
    INSERT INTO temp_ids (num) VALUES (1),(2),(1),(3);
    Ensuite, un bon vieux INNER JOIN fait le travail. Ça c’est juste pour voir ce que ça donne :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM fiches INNER JOIN temp_ids
        ON temp_ids.num = fiches.id_fiche;
    Mais je pense que tu vois où je veux en venir : utiliser SUM là-dessus.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT SUM(fiches.nombre_fiches) FROM fiches INNER JOIN temp_ids
        ON temp_ids.num = fiches.id_fiche;

    Comme chaque requête HTTP (et à plus forte raison, chaque requête ajax) est traitée par un contexte différent sur le serveur, cela veut dire que la session SQL (entre le serveur web et le serveur SQL) est différente à chaque fois, donc la table temporaire est oubliée entre chaque requête ajax / rechargement de page.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Multiselection Javascript Boucle for
    Par pimouche dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/02/2016, 16h25
  2. Ma boucle for en javascript ne s'incrémente pas
    Par mourad_betelgeuse dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 14/08/2013, 09h37
  3. Boucles do while/while/for JavaScript
    Par ouarrich.said dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/02/2013, 09h42
  4. javascript : création d'une boucle "for"
    Par Ekinea dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/08/2009, 13h20
  5. [Entities] boucle for javascript dans un xslt
    Par loic_86 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 28/03/2007, 13h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo