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 :

Listes liées dans une boucle while


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 21
    Points : 16
    Points
    16
    Par défaut Listes liées dans une boucle while
    bonjour à tous, svp veuillez m'aider à résoudre mon problème. j'ai des listes déroulantes liées avec la fonction onchange(), jusque la je n'ai aucun souci tous ce passe nikel, le problème c'est quand j'ai mis ces listes dans une boucle car le user à 5 choix à faire(ma boucle a 5 itération) la 1ere itération ne me pose aucun problème, tandis que la seconde si, quand je change dans la 2eme liste, la 1ere liste se modifie et ne se passe aucun changement sur la seconde et idem pour les autre itération.
    voici le code php de mes select (les 5 itération)
    Code PHP : 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
    <?php $i=1;	
    	while($i <= 5) { ?>
    		<select name="secteur" id="secteur" onchange="o()" tabindex="10" >											
    			<option value='0'>choisissez le secteur</option>
                                <?php $rep=$bdd->query('SET NAMES `utf8`');	 
    				      $rep= $bdd->prepare('SELECT * FROM secteur');
    	                              $rep->execute(array());
    						                 while ($donnees=$rep->fetch())
                                             { ?>
    	                                              <option value="<?php echo $donnees['id_secteur']; ?>"><?php echo $donnees['sect']; ?></option>
    							               <?php
    	                                       } 
    					                        ?>
                           </select>
    		       <select name="inspection" id="inspection"  style='display:inline' >
    				<option value='0'>choisissez l'inspection</option>
    		       </select>
     
    		<?php $i++;} ?>

    et voici le code js fonction o()
    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 o(){
    				var xhr = getXhr();
    				// On défini ce qu'on va faire quand on aura la réponse
    				xhr.onreadystatechange = function(){
    					// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    					if(xhr.readyState == 4 && xhr.status == 200){
    						leselect = xhr.responseText;
    						// On se sert de innerHTML pour rajouter les options a la liste
    						document.getElementById('inspection').innerHTML = leselect;
     
    					}
    				}
     
    				// Ici on va voir comment faire du post
    				xhr.open("POST","ajax_inspection.php",true);
    				// ne pas oublier ça pour le post
    				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    				// ne pas oublier de poster les arguments
    				// ici, l'id du corp
    				sel = document.getElementById('secteur');
    				idsecteur = sel.options[sel.selectedIndex].value;
    				xhr.send("id_secteur="+idsecteur);
    			}
    et voici la page ajax_inspection.php:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     <select name='inspection' id ='inspection'>
       <option value=""></option>
    <?php if(isset($_POST["id_secteur"])){
    		include("../connx_bdd.php");
    	        $rep=$bdd->query('SET NAMES `utf8`');	 
    	        $rep= $bdd->prepare('SELECT * FROM inspection WHERE secteur="'.$_POST["id_secteur"].'" ');
    	        $rep->execute(array());
    		while ($donnees=$rep->fetch())
                                             { ?>
    	                                              <option value="<?php echo $donnees['id_inspec']; ?>"><?php echo $donnees['inspec']; ?></option>
     
    	                                     <?php     } 
     
    		}?>
    	</select>

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 058
    Points : 44 588
    Points
    44 588
    Par défaut
    Bonjour,
    il y a déjà un soucis de taille lorsque tu crées ton document
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while($i <= 5) { ?>
    	<select name="secteur" id="secteur" onchange="o()" tabindex="10" >
    cela signifie que tu as une ID qui est dupliqué et donc cela ne pourra donc pas fonctionner car dans ta fonction on trouve
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      sel = document.getElementById('secteur');
      idsecteur = sel.options[sel.selectedIndex].value;
      xhr.send("id_secteur=" + idsecteur);
    Il te faut revoir ton approche.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    grand merci pour votre réponse, avez vous svp une solution à me proposer

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 058
    Points : 44 588
    Points
    44 588
    Par défaut
    Une façon de faire :
    • Dans ta boucle PHP incrémente les ID à l'aide de la variable $i par exemple.
    • Dans l'appel de la fonction mentionnée sur le onchange de ton <select> passe en paramètre l'incrément, $i, de la sorte tu pourras l'utiliser dans ta fonction o. Au passage prend l'habitude de nommer tes fonctions avec de « vrai nom ».
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function onChangeSelect(indice){
      // ton code en utilsant la valeur de indice
    }

  5. #5
    Membre à l'essai
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    encore un grand merci pour votre réponse assez claire, mais svp je serais très reconnaissante si vous m'illustrer votre solution dans un petit exemple.
    merci encore
    bonne journée

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

    1- Déjà, on peut (avantageusement) remplacer :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php $i=1;	
    	while($i <= 5) { ?>
    ...
    <?php $i++;} ?>
    par :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php for($i=1; $i<=5; $i++;) { ?>
    ...
    <?php } ?>

    2- Ensuite, il faut IDENTIFIER chaque select, name, id de chaque boucle, grâce à $i :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php for($i=1; $i<=5; $i++;) { ?>
    		<select name="secteur[<?php echo $i; ?>]" id="secteur-<?php echo $i; ?>" onchange="onChangeSelect(<?php echo $i; ?>)" tabindex="10" >
    ...
    		<select name="inspection[<?php echo $i; ?>]" id="inspection-<?php echo $i; ?>"  style="display:inline;" >
    ...
    <?php } ?>
    Et dans la fonction JavaScript :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function onChangeSelect( indice )
    {
    ...
    	document.getElementById('inspection-'+indice).innerHTML = leselect; // on cible le bon select "inspection"
    ...
    	sel = document.getElementById('secteur-'+indice); // on cible le bon select "secteur"
    	idsecteur = sel.options[sel.selectedIndex].value;
    	xhr.send("id_secteur="+idsecteur);
    ...
    }

    3- Lors du traitement PHP du formulaire (après submit) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php foreach($_POST['secteur'] as $i => $val) { 
    	$secteur_id[$i] = $_POST['secteur'][$i]; // ou $val
    	$inspection_id[$i] = $_POST['inspection'][$i];
    } 
    ?>
    Dernière modification par Invité ; 06/02/2019 à 11h49.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    Merci pour votre exemple qui était assez clair, mais votre méthode n'a pas marché pour moi, le onchange ne fonctionne plus même pour la première itération de la boucle

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

    Si tu ne montres pas ton code, on ne peut rien en dire...

  9. #9
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 058
    Points : 44 588
    Points
    44 588
    Par défaut
    Je rajouterais, le code HTML généré, CTRL +U, souvent très instructif sur les erreurs commises.

  10. #10
    Membre à l'essai
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    voici mon code j'ai suivi votre exemple mais le onchange ne marche plus même pour la première itération
    Code PHP : 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
    <?php $i=1;	
    	while($i <= 5) { ?>
    		<select name="secteur" id="secteur-<?php echo $i;?>" onchange="o(<?php echo $i;?>)" tabindex="10" >											
    			<option value='0'>choisissez le secteur</option>
                                <?php $rep=$bdd->query('SET NAMES `utf8`');	 
    				      $rep= $bdd->prepare('SELECT * FROM secteur');
    	                              $rep->execute(array());
    						                 while ($donnees=$rep->fetch())
                                             { ?>
    	                                              <option value="<?php echo $donnees['id_secteur']; ?>"><?php echo $donnees['sect']; ?></option>
    							               <?php
    	                                       } 
    					                        ?>
                           </select>
    		       <select name="inspection" id="inspection-<?php echo $i;?>"  style='display:inline' >
    				<option value='0'>choisissez l'inspection</option>
    		       </select>
     
    		<?php $i++;} ?>

    et voici le code js (fonction o())
    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 o(indice){
    				var xhr = getXhr();
    				// On défini ce qu'on va faire quand on aura la réponse
    				xhr.onreadystatechange = function(){
    					// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    					if(xhr.readyState == 4 && xhr.status == 200){
    						leselect = xhr.responseText;
    						// On se sert de innerHTML pour rajouter les options a la liste
    						document.getElementById('inspection-'+indice).innerHTML = leselect;
     
    					}
    				}
     
    				// Ici on va voir comment faire du post
    				xhr.open("POST","ajax_inspection.php?id="+indice,true);
    				// ne pas oublier ça pour le post
    				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    				// ne pas oublier de poster les arguments
    				// ici, l'id du corp
    				sel = document.getElementById('secteur-'+indice);
    				idsecteur = sel.options[sel.selectedIndex].value;
    				xhr.send("id_secteur="+idsecteur);
    			}
    et voici la page ajax_inspection.php:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     <select name='inspection' id ='inspection-<?php echo $_GET['id'];?>'>
       <option value=""></option>
    <?php if(isset($_POST["id_secteur"])){
    		include("../connx_bdd.php");
    	        $rep=$bdd->query('SET NAMES `utf8`');	 
    	        $rep= $bdd->prepare('SELECT * FROM inspection WHERE secteur="'.$_POST["id_secteur"].'" ');
    	        $rep->execute(array());
    		while ($donnees=$rep->fetch())
                                             { ?>
    	                                              <option value="<?php echo $donnees['id_inspec']; ?>"><?php echo $donnees['inspec']; ?></option>
     
    	                                     <?php     } 
     
    		}?>
    	</select>

  11. #11
    Invité
    Invité(e)
    Par défaut
    1-
    Citation Envoyé par NoSmoking Voir le message
    ..., le code HTML généré, CTRL +U, ...
    2- Tu n'as pas appliqué toutes mes modifications.

    3- dans ajax_inspection.php, il faut enlever la balise <select>.

  12. #12
    Membre à l'essai
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    j'ai enlevé le select mais tjr rien

  13. #13
    Invité
    Invité(e)
    Par défaut
    Fais un copier-coller des codes ci-dessous.

    Code PHP : 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
    <?php 
    	for($i=1; $i<=5; $i++;) 
    	{ 
    ?>
    	<select name="secteur[<?php echo $i; ?>]" id="secteur-<?php echo $i; ?>" onchange="getOptionsInspectionBySecteur(<?php echo $i; ?>)" tabindex="10" >
    		<option value="0">choisissez le secteur</option>
    <?php 	$rep=$bdd->query('SET NAMES `utf8`');	 
    		$rep= $bdd->prepare('SELECT id_secteur, sect FROM secteur');
    		$rep->execute(array());
    		while ($donnees=$rep->fetch())
    		{ 
    ?>
    		<option value="<?php echo $donnees['id_secteur']; ?>"><?php echo $donnees['sect']; ?></option>
    <?php
    		} 
    ?>
    	</select>
    	<select name="inspection[<?php echo $i; ?>]" id="inspection-<?php echo $i; ?>"  style="display:inline;" >
    		<option value="0">choisissez d'abord le secteur</option>
    	</select>
    <?php 
    	} 
    ?>

    Code JavaScript : 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
    function getOptionsInspectionBySecteur(indice)
    {
    	var xhr = getXhr();
    	// On défini ce qu'on va faire quand on aura la réponse
    	xhr.onreadystatechange = function(){
    		// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    		if(xhr.readyState == 4 && xhr.status == 200){
    			var selectOptions = xhr.responseText;
    			// On se sert de innerHTML pour rajouter les options a la liste
    			document.getElementById('inspection-'+indice).innerHTML = selectOptions;
    		}
    	}
    	// Ici on va voir comment faire du post
    	xhr.open("POST","ajax_inspection.php",true);
    	// ne pas oublier ça pour le post
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	// ne pas oublier de poster les arguments
    	// secteur sélectionné
    	var sel = document.getElementById('secteur-'+indice);
    	var id_secteur = sel.options[sel.selectedIndex].value;
    	xhr.send("id_secteur="+id_secteur);
    }

    ajax_inspection.php :
    Code PHP : 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
    <?php 
    	if( !empty($_POST["id_secteur"]) )
    	{
    ?>
    		<option value="0">choisissez l'inspection</option>
    <?php 
    		include("../connx_bdd.php");
    		$rep=$bdd->query('SET NAMES `utf8`');	 
    		$rep= $bdd->prepare("SELECT id_inspec, inspec FROM inspection WHERE secteur=:id_secteur");
    		$rep->execute(array( ':id_secteur' => $_POST["id_secteur"]));
    		while ($donnees=$rep->fetch())
    		{ 
    ?>
    		<option value="<?php echo $donnees['id_inspec']; ?>"><?php echo $donnees['inspec']; ?></option>
    <?php
    		}
    <?php
    	} else {
    ?>
    		<option value="0">choisissez d'abord le secteur</option>
    <?php
    	}

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

Discussions similaires

  1. [Tkinter] Méthode get() dans une boucle while
    Par Thundie dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/02/2006, 00h06
  2. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  3. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07
  4. Réponses: 6
    Dernier message: 17/06/2005, 16h51
  5. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51

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