Garder la sélection avec une requete ajax

Résolu/Fermé
mipolette Messages postés 99 Date d'inscription lundi 20 août 2012 Statut Membre Dernière intervention 22 mai 2014 - 10 nov. 2012 à 17:36
mipolette Messages postés 99 Date d'inscription lundi 20 août 2012 Statut Membre Dernière intervention 22 mai 2014 - 11 nov. 2012 à 10:44
Bonjour a tous,

je clique sur des catégories dans mon premier select, et cela me génère la liste associée dans mon second select, au travers d'une requête ajax.
Mais lorsque dans mon formulaire, j'ai une erreur, je perds cette sélection...
Quelqu'un pourrait m'aider svp...

voici le code que va chercher ma requete ajax:

 
try{
		$bdd = new PDO("mysql:host=localhost;dbname=bddmalou","root", "");
     }
		catch(Exception $e)
	{
	die("message:" . $e->getMessage());
	}
				
	$reqAffCategorie = $bdd->query("SELECT * FROM categorie  WHERE idtype = " . $_GET['id_type']);
					
  while($donnees = $reqAffCategorie->fetch()) 
	{	
		if($blnErreur)
	      {
		 
		  echo '<option value ="' . $donnees["id"] . '"';
		  if($donnees['id'] == $_POST['cboCategorie'])
		  {
		      echo 'selected="selected"';
		  }
		  echo '>' . utf8_encode($donnees['nom']) . '</option>';
		 }
		  else
		 {
		     echo '<option value ="' . $donnees["id"] . '">' . utf8_encode($donnees['nom']) . '</option>';
		  }				
	   }
		$reqAffCategorie->closeCursor();


merci d'avance


8 réponses

Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
10 nov. 2012 à 19:11
tu perds la sélection au niveau du premier select ?
0
mipolette Messages postés 99 Date d'inscription lundi 20 août 2012 Statut Membre Dernière intervention 22 mai 2014 99
10 nov. 2012 à 19:13
non pour le premier, ça fonctionne bien...
0
mipolette Messages postés 99 Date d'inscription lundi 20 août 2012 Statut Membre Dernière intervention 22 mai 2014 99
10 nov. 2012 à 19:17
en fait, par défaut, quand j'arrive sur la page, le premier select est directement connecté à la BD, et le deuxième select comprend dedans la liste de mon premier champ dans mon premier select.
Quand il y a une erreur dans mon formulaire, le premier select reste bon, mais le deuxième revient automatiquement au réglage par défaut..
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
10 nov. 2012 à 19:22
il faut plutôt la fonction javascript pour ton problème

qu'est ce qu'il peut y avoir comme erreur ?
0
mipolette Messages postés 99 Date d'inscription lundi 20 août 2012 Statut Membre Dernière intervention 22 mai 2014 99
10 nov. 2012 à 19:32
en fait ma page est un formulaire d'ajout de produits, et donc parmis les erreurs, tu peux avoir :
-abscence d'écriture dans les champs
-des mauvais caractères dans les champs
-photos trop volumineuse

des vérifs comme ça quoi...
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
10 nov. 2012 à 19:35
quel rapport avec le select ?

sans code c'est difficile de comprendre...
0
mipolette Messages postés 99 Date d'inscription lundi 20 août 2012 Statut Membre Dernière intervention 22 mai 2014 99
10 nov. 2012 à 19:52
voici le code ma page pour les deux selects:

<label for="cboType">Choisir le type</label>
		<select name="cboType" id="cboType">
		<?php
								
		//Requête d'affichage pour les types
					
		$reqAffType = $bdd->query("SELECT * FROM type ");
					
		//Affichage des types
									
		while($donnees = $reqAffType->fetch()) 
		{	
			if($blnErreur)
			{
			//Affichage du type sélectionné en cas d'erreur du formulaire
			echo '<option value ="' . $donnees["id"] . '"';
			if($donnees['id'] == $_POST['cboType'])
				{
				echo 'selected="selected"';
				}
				echo '>' . utf8_encode($donnees['nom']) . '</option>';
			}
			else
			{
			       echo '<option value ="' . $donnees["id"] . '">' . utf8_encode($donnees['nom']) . '</option>';
			}
		}
		$reqAffType->closeCursor();
		?>
					
		</select>
					
		<!--Select pour les categories-->
		<label for="cboCategorie">Choisir la catégories</label>
		<select name="cboCategorie" id="cboCategorie">
		<?php
								
		//Récupération de l'id du type pour affichage des catégories
									
		$reqAffType = $bdd->query("SELECT * FROM type ");
		$donneesType = $reqAffType->fetch();
		$reqAffType->closeCursor();
					
					
		//Requête d'affichage des catégories suivant l'id du type
				
					
		$reqAffCategorie = $bdd->query("SELECT * FROM categorie  WHERE idtype = " . $donneesType["id"]);
					
		//Affichage des catégories
									
		while($donnees = $reqAffCategorie->fetch()) 
		{	
			if($blnErreur)
		{
		//Affichage de la catégorie sélectionnée en cas d'erreur sur le formulaire
		echo '<option value ="' . $donnees["id"] . '"';
		if($donnees['id'] == $_POST['cboCategorie'])
		{
			echo 'selected="selected"';
		}
		      echo '>' . utf8_encode($donnees['nom']) . '</option>';
		}
		else
		{
			echo '<option value ="' . $donnees["id"] . '">' . utf8_encode($donnees['nom']) . '</option>';
		}						
		}
		$reqAffCategorie->closeCursor();




et voici le code que va chercher ma requete ajax:

try{
		$bdd = new PDO("mysql:host=localhost;dbname=bddmalou","root", "");
		}
		catch(Exception $e)
		{
			die("message:" . $e->getMessage());
		}
				
					
		$reqAffCategorie = $bdd->query("SELECT * FROM categorie  WHERE idtype = " . $_GET['id_type']);
					
		//Affichage des catégories
									
		while($donnees = $reqAffCategorie->fetch()) 
		{	
			if($blnErreur)
		        {
			//Affichage de la catégorie sélectionnée en cas d'erreur sur le formulaire
			echo '<option value ="' . $donnees["id"] . '"';
			if($donnees['id'] == $_POST['cboCategorie'])
			{
				echo 'selected="selected"';
			}
			       echo '>' . utf8_encode($donnees['nom']) . '</option>';
			}
			else
			{
				echo '<option value ="' . $donnees["id"] . '">' . utf8_encode($donnees['nom']) . '</option>';
							}						
			}
			$reqAffCategorie->closeCursor();



J' ai essayé pas mal de solution, mais je 'y arrive pas...T'y vois un peu plus clair?
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
10 nov. 2012 à 19:56
il me faut le javascript aussi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mipolette Messages postés 99 Date d'inscription lundi 20 août 2012 Statut Membre Dernière intervention 22 mai 2014 99
10 nov. 2012 à 19:59
<script>

$("document").ready(function(){

var cboType = $("#cboType");
var cboCategorie = $("#cboCategorie");

//Au changement du type slect:
$(cboType).change(function(){

var val = $(this).val();

$.ajax({

type:"GET",
url:"http://localhost/essaiSiteDuZero/BDDSiteZero/changeSelectCategorie.php",
data:"id_type="+val,
success:function(msg)
{
cboCategorie.html(msg);
}
});

});
});

</script>
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
10 nov. 2012 à 20:11
teins j'ai un peu optimisé ton code sans changer l'algo et sécurisé un peu ta requête ajax
		<label for="cboType">Choisir le type</label>
		<select name="cboType" id="cboType">
		<?php

		//Requête d'affichage pour les types

		$reqAffType = $bdd->query('SELECT id,nom FROM type');

		//Affichage des types
		$premierType = false;
		while($donnees = $reqAffType->fetch()) {
			if($premierType === false) $premierType = $donnees['id']
			if($blnErreur) echo '<option value ="' . $donnees['id'] . '"'.(($donnees['id'] == $_POST['cboType'])? 'selected="selected"':'').'>'.utf8_encode($donnees['nom']).'</option>';
			else echo '<option value ="' . $donnees['id'] . '">' . utf8_encode($donnees['nom']) . '</option>';
		}
		$reqAffType->closeCursor();
		?>

		</select>

		<!--Select pour les categories-->
		<label for="cboCategorie">Choisir la catégories</label>
		<select name="cboCategorie" id="cboCategorie">
		<?php
		//Requête d'affichage des catégories suivant l'id du type
		$req = $bdd->prepare('SELECT id,nom FROM categorie WHERE idtype = :idType');
		$reqAffCategorie = $req->execute(array('idType' => $premierType));

		//Affichage des catégories

		while($donnees = $reqAffCategorie->fetch()) {
			if($blnErreur) echo '<option value ="' . $donnees['id'] . '"'.(($donnees['id'] == $_POST['cboCategorie'])? 'selected="selected"':'').'>'.utf8_encode($donnees['nom']).'</option>';
			else echo '<option value ="' . $donnees['id'] . '">' . utf8_encode($donnees['nom']) . '</option>';
		}
		$reqAffCategorie->closeCursor();



		try {
			$bdd = new PDO("mysql:host=localhost;dbname=bddmalou","root", "");
		}
		catch(Exception $e) {
			die("message:" . $e->getMessage());
		}


		$req = $bdd->prepare('SELECT id,nom FROM categorie WHERE idtype = :idType');
		$reqAffCategorie = $req->execute(array('idType' => $_GET['id_type']));

		//Affichage des catégories

		while($donnees = $reqAffCategorie->fetch()) {
			if($blnErreur) echo '<option value ="' . $donnees['id'] . '"'.(($donnees['id'] == $_POST['cboCategorie'])? 'selected="selected"' : '').'>'.utf8_encode($donnees['nom']).'</option>';
			else echo '<option value ="' . $donnees['id'] . '">' . utf8_encode($donnees['nom']) . '</option>';
		}
		$reqAffCategorie->closeCursor();
0
mipolette Messages postés 99 Date d'inscription lundi 20 août 2012 Statut Membre Dernière intervention 22 mai 2014 99
10 nov. 2012 à 20:23
du coup je suis plus chez moi..
ça devrait améliorer quoi ce que tu as fais?
En tout cas merci pour tes réponses aussi rapides..
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
10 nov. 2012 à 21:32
les requêtes préparé évitent les injections sql

il y avait une requête inutile puisque déjà faite plus haut

et a moins de d'avoir besoin de tout les champs d'une table il ne faut jamais faire SELECT * FROM
mais
SELECT champ1,champ2,champ3 FROM

ensuite quand tu ne veux récupérer ou modifier qu'une ligne ou un nombre de ligne connu il faut mettre des limits (ca manquait dans la requête préparé

$blnErreur correspond a quoi ?


je ne connais pas jQuery je ne l'utilise pas, je pense m'y mettre mais bon bref....
mais sinon rien ne me choque dans le code

Je ne suis pas sur de comprendre le problème, dis moi si c'est ça :

Quand tu transmet le formulaire (rafraichissement de la page) et qu'il y a une erreur.
le formulaire se réaffiche.
le premier select est gardé en cache par le navigateur donc celui qui était sélectionné s'affiche mais l'autre ne correspond plus puisqu'il n'est pas chargé...
du coup les 2 select ne correspondent plus

si c'est ça il y a 2 façon de faire

1 : charger le second select avec un xhr au chargement de la page (de la même facon que ton "change" pour les resynchroniser

2 : le faire en php avec une variable de session ou la variable post comme tu veux ou peux
0
mipolette Messages postés 99 Date d'inscription lundi 20 août 2012 Statut Membre Dernière intervention 22 mai 2014 99
11 nov. 2012 à 10:44
Je te remercie pour tout tes conseils, j'ai compris pas mal de truc, notamment l'utilité des réquête préparées...:)
Du coup, j'ai tilisé la méthode POST pour récupérer la sélection, et ça fonctionne bien.
Mon $blnErreur, correspond à la variable qui détecte une erreur dans le formulaire.
Merci encore pour tes explications
0