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

PHP & Base de données Discussion :

Listes SELECT en cascade, alimentées par des tables sql


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 19
    Points
    19
    Par défaut Listes SELECT en cascade, alimentées par des tables sql
    Bonjour à tous

    Mon besoin :

    3 listes déroulantes en cascade : lstFonctionRomeN1, lstFonctionRomeN2 et lstFonctionRomeN3.
    Le script php effectue les 3 requetes sur une base mysql avant l'affichage de la page, chaque liste étant alimentée par une table différente.
    Je récupère donc les 3 résultats de requete (Je ne veux pas faire de requetes en javascript).

    J'affiche mon formulaire : la 1ere liste est remplie, les deux autres sont vides.

    Lorsque l'utilisateur sélectionne un élément de la liste 1, la 2eme liste est peuplée par une fonction javascript appellée par l'évènement onchange de la 1ere liste. Et ainsi de suite pour la 3eme liste.

    Mon problème :

    Passer le résultat d'une requete en argument à la fonction javascript qui remplit la liste suivante !
    Pour cela, je transforme d'abord le résultat de la requete sous forme de tableau (fonction "fncConvertir_ResultSQL_Array($resultSQL)") puis j'utilise json_encode pour convertir ce tableau en chaine. Ensuite, je pensais pouvoir reconvertir la chaine en tableau avec json_decode dans la fonction javascript...

    Ce qui ne fonctionne pas :

    La transformation du résultat d'une requete en chaine semble bien fonctionner, mais lorsque je transfère cette chaine à la fonction javascript, celle-ci ne s'éxecute pas...

    Merci d'avance pour toute l'aide que vous pourrez m'apporter (ça fait 2 jours que je rame sur ce truc !)

    Le code :

    Le bout de programme qui crée la 1ère liste :

    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
     
    $sourceRomeN2 = fncConvertir_ResultSQL_Array($resultRomeN2);
    $vSourceDataCode = "";
    $vSourceDataCode = json_encode($sourceRomeN2);
    echo $vSourceDataCode;
    echo '<select name="lstFonctionRomeN1" size="1" class="large" id="lstFonctionRomeN1" '
    	.'onchange="javascript:jsRemplirListeFille(\'lstFonctionRomeN2\', this.options[this.selectedIndex].value, '
    	.'\''.$vSourceDataCode.'\');" tabindex="'.$tabindex.'">';
    	// Crée les lignes d'options du select
    	echo '<option value="-1" selected="selected">'.utf8_encode('-- choisissez une fonction --')
    		.'</option>';
    	mysql_data_seek($resultRomeN1,0);
    	while ($row=mysql_fetch_array($resultRomeN1)) {
    		if ($row['RomeN1'] == 'FR') {
    			$selected = 'selected="selected"';
    		} else {
    			$selected = '';
    		}
    		echo '<option value="'.utf8_encode($row['RomeN1']).'" '.$selected.'>'
    			.utf8_encode($row['RomeN1'].' - '.$row['LibRomeN1']).'</option>';
    	}
    la fonction de conversion du résultat d'une requete en tableau :

    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
    30
    31
    32
    33
    34
     
    function fncConvertir_ResultSQL_Array($resultSQL) {
    	//==================================================================================
    	// Crée un tableau associatif de la forme tableau["nomchamp"][n°ligne]
    	// contenant le résultat d'une requête mysql.
    	// $resultSQL : résultat d'une requête SELECT.
    	// $nomArray : nom de la variable tableau à créer.
    //==================================================================================
    	$taille = mysql_num_rows($resultSQL);
    	// Ecriture de la déclaration du tableau si la requête
    	// contient quelque chose, sinon déclaration d'un tableau null.
    	$numfields = mysql_num_fields($resultSQL);
    	if($numfields > 0) {
    		// Déclaration de la variable tableau.
    		$nomArray = Array($numfields);
    		// Déclaration des tableaux de valeurs pour chaque champs.
    		for($i=0; $i < $numfields; $i++) {
    			$nomArray[mysql_field_name($resultSQL, $i)] = Array($taille);
    		}
    		if($taille>0) {
    			// Déclaration du reste des valeurs du résultat de la requête.
    			$i=0;
    			while($data = mysql_fetch_assoc($resultSQL)) {
    				foreach($data as $key => $value) {
    					$nomArray[mysql_escape_string($key)][$i] = mysql_escape_string($value);
    				}
    				$i++;
    			}
    		}
    	} else {
    		$nomArray = null;
    	}
    	return $nomArray;
    }
    la fonction javascript qui refuse de s'éxecuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function jsRemplirListeFille(vNomListeCible, vValeurFiltre, vSourceDataCode) {
    	alert ('vNomListeCible : ' + vNomListeCible + '  |  vValeurFiltre : ' + vValeurFiltre);
    }
    et le contenu de $vSourceDataCode que je veux transférer à la fonction javascript et qui parait correct:

    {"0":3,"RomeN1":["0","11","11","11","12","12","13","13","13","14","14","14","21","22","22","23","23","24","24","24","31","31","32","32","32","33","33","33","41","41","42","42","43","43","43","43","44","44","44","45","45","45","45","46","46","46","47","47","47","47","51","51","52","52","52","53","53","53","61","61","61"],"RomeN2":["0","111","112","113","121","122","131","132","133","141","142","143","211","221","222","231","232","241","242","243","311","312","321","322","323","331","332","333","411","412","421","422","431","432","433","434","441","442","443","451","452","453","454","461","462","463","471","472","473","474","511","512","521","522","523","531","532","533","611","612","613"],"LibRomeN2":["","Personnel des services aux personnes","Personnel des services aux entreprises et aux collectivites","Personnel de la securite publique","Personnel des services administratifs","Personnel des services commerciaux","Personnel de l\'hotelerie","Personnel de la restauration","Personnel de cafe, bar-brasserie","Personnel de la distribution","Personnel de la vente","Personnel des forces de vente","Professionnels des arts","Professionnels de la formation initiale","Professionnels de la formation continue","Professionnels de l\'intervention sociale et culturelle","Professionnels de l\'intervention socio-economique","Professionnels des soins paramedicaux","Professionnels medico-techniques","Professionnels de la reeducation et de l\'appareillage","Praticiens de la sante","Praticiens medico-techniques","Cadres de la gestion administrative","Professionnels de l\'information et de la communication","Professionnels de l\'informatique","Cadres de la gestion commerciale","Cadres de la banque, des assurances et de l\'immobilier","Cadres dirigeants","Personnel de la production agricole","Personnel de la peche et de la navigation maritime et fluviale","Personnel du gros oeuvre et des travaux publics","Personnel du second oeuvre","Conducteurs d\'engins de transport terrestre","Conducteurs d\'engins de manoeuvre, de genie civil et agricole","Personnel de la logistique (manutention, gestion, exploitation des transports)","Personnel d\'accompagnement du transport","Personnel de la construction mecanique et du travail des metaux","Personnel de la construction electrique et electronique","Personnel d\'entretien, maintenance","Conducteur d\'installation des industries chimiques, production d\'energie et industries agroalimentaire","Conducteur d\'installation de la metallurgie et des materiaux","Conducteur d\'installation de l\'industrie lourde du bois et du papier-carton","Personnel des fonctions trans-sectorielles aux industries de process","Personnel des industries des materiaux souples (textile, habillement, cuir)","Personnel des industries graphiques","Personnel des industries de l\'ameublement et du bois","Personnel de l\'alimentation","Personnel artisanal de l\'habillement, du cuir et du textile","Personnel du travail artisanal des materiaux","Personnel artisanal divers","Agents d\'encadrement de fabrication industrielle","Agent d\'encadrement de maintenance","Techniciens de preparation de la production","Techniciens de fabrication, controle","Techniciens d\'installation, maintenance","Cadres techniques de preparation de la production","Cadres techniques de production","Cadres technico-commerciaux et de maintenance","Agents de maitrise, techniciens, ingenieur de l\'agriculture et de la peche","Agents de maitrise, techniciens, ingenieur du btp et de l\'extraction","Techniciens et cadres du transport et de la logistique"]}

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 19
    Points
    19
    Par défaut
    Mais j'ai peut être abordé ce problème d'une mauvaise façon ?

    Pour résumer : j'ai trois listes en cascade, peuplées à partir de données situées dans 3 tables différentes.
    Je ne veux pas faire de requete SQL dans une fonction javascript (le code javascript étant visible côté client, ça m'ennuie, question de sécurité).
    J'aimerais éviter la solution qui consiste à recharger la page quand on sélectionne un élément.

    Comment, compte tenu de ces contraintes, peupler une liste fille en fonction de l'élément sélectionné dans la liste mère ?

  3. #3
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Pourquoi ne pas s'orienter sur de l'AJAX? Une fonction javascript appelerait un script php et ferait par exemple passer la liste à 'visible' sur l'evenement 'onChange' de la première liste (pour le nom de l'evenement je suis pas sur mais on m'aura surement compris^^), l'appel sera en clair côté client, mais il ne vera pas la requête qui est effectué.

    Bon c'est peut être pas la meilleure solution mais ca marcherait !^^ Bon courage !
    ►Ne pas oublier le

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2005
    Messages : 357
    Points : 537
    Points
    537
    Par défaut
    Salut,
    Obito +1, je pense que cela rendrait ton appli beaucoup plus simple et efficace.
    Cela réduirait la quantité de données passées et donc accélèrerait la vitesse d'affichage de ta page en plus de rendre ton code beaucoup plus léger.

    Si tu débute avec Ajax. Je te conseille les bibliothèques javascript Prototype ou JQuery qui facilitent grandement l'implémentation Ajax.

Discussions similaires

  1. Liste déroulante alimentée par 2 tables
    Par Brian35 dans le forum Langage
    Réponses: 1
    Dernier message: 09/05/2012, 10h48
  2. Réponses: 6
    Dernier message: 06/08/2009, 11h02
  3. Listes SELECT en cascade, alimentées par des tables mysql
    Par Lamanne dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 07/02/2009, 22h24
  4. Réponses: 6
    Dernier message: 21/07/2008, 11h21
  5. trier un stringgrid alimenter par une table MySql
    Par boopix dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/03/2007, 14h28

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