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 SELECT en cascade, alimentées par des tables mysql [Fait]


Sujet :

JavaScript

  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 mysql
    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
    $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
    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
    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 régulier
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 99
    Points : 78
    Points
    78
    Par défaut
    salut,

    pourquoi créer un tableau pour le mettre en chaine pour le retransformer en tableau?

    2 ième question pourquoi ne pas utiliser AJAX?

    ça résoudrait grandement tes problèmes et ensuite tous tes traitements doivent prendre un certain temps nan?

  3. #3
    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
    Eh bien, en fait, les conversions successives viennent du fait que je ne sais pas faire autrement pour passer un tableau de valeurs à une fonction javascript depuis php.

    Pour Ajax, je ne connais pas du tout.

    En fait, je débute en php et javascript aussi, ayant plutôt plus d'expérience en vb.net...

    Mais je suis ouvert à toute suggestion !

  4. #4
    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 ?

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    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é).
    Ca tombe bien c'est impossible

    Sinon, à part Ajax, je ne vois pas trop comment tu peux y arriver. Cependant, j'ai un peu peur que tu n'aies pas tout à fait appréhendé le fait que PHP s'exécute coté serveur et JavaScript coté client. Donc, même s'il est possible de transmettre des données de l'un à l'autre, l'environnement PHP n'existe plus pour JavaScript et l'environnement JavaScript n'existe pas encore pour PHP.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  6. #6
    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
    Salut Bovino,

    En fait, j'avais pas pensé à ça. En fait, le résultat de requête n'est pas persistent dans la page html, une fois celle-ci générée par php, si je ne m'abuse.

    Alors est-il possible de stocker ce résultat dans un champ caché (un textarea, par exemple) sous forme de chaine, afin de la transmettre à la fonction javascript sur l'évènement onchange ? Dans la mesure où ce ne sont pas des données sensibles (listes normatives, pas des données client), ça ne me semble pas dangereux.

    Autre solution : stocker ces tableaux de valeurs "en dur" dans la fonction javascript... mais là, ça devient porcin...

    Sinon, en ajax, comment fait-t'on ? avez-vous des exemples ?

  7. #7
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    salut

    Il y a un a un tuto complet "Ajax" sur ce forum, et les listes liées ont tellement été traitées dans tous les sens que c'est devenu depuis 2 ou 3 ans un sujet tabou!

    si tes tables sont construites de manière claire, tu n'as en gros que le code php/mysql à travailler: côté JS/Ajax, il te suffit d'envoyer la valeur du select à chaque requête, et pas un tableau;

  8. #8
    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
    J'ai bien trouvé ce tuto sur le forum : http://siddh.developpez.com/articles/ajax/#LIV-A

    Mais la techno décrite ici implique de faire une requete sql pour remplir la liste fille à chaque fois que l'on change l'élément sélectionné dans la liste mère, ce que je voudrais éviter...

  9. #9
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    pourquoi?

  10. #10
    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
    Mon hébergeur impose une limite de 50 connexions simultanées à la bdd pour rester en hébergement mutualisé. Comme je n'ai aucune connaissances en administration serveur, je veux rester en hébergement mutualisé le plus longtemps possible, le temps de trouver quelqu'un pour prendre ça en charge.
    ALors j'optimise mon code pour réduire au maximum le nombre de requetes sql.

  11. #11
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Tiens, c'est la première fois que j'entends parler de ce type de limitation... Cependant ne travaillant que sur du dédié et ne gérant pas les hébergement, je suis pas forcément au courant de tout.
    Ceci dit, cela me semble plus lié à vouloir inciter à la fermeture systématique des connexions qu'autre chose...

    En revanche, concernant ta demande, Ajax ne t'oblige pas à aller requêter une BDD, donc une solution possible dans le cadre du rechargement dynamique de selects pourrait (je dis bien pourrait, car cela dépend de la structure de ta base) être d'exporter tes données concernant ces listes dans des fichiers XML, voire des fichiers textes reprenant une structure au format JSON par exemple dont tu irais récupérer le contenu via Ajax (tu pointes ta requête vers le fichier souhaité pour ensuite traiter la réponse coté JavaScript et construire le contenu de tes listes.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  12. #12
    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
    Ah voilà une réponse qui me plait !

    D'autant que les données destinées à alimenter les select sont quasiment invariables. Il s'agit de listes normées, mises à jour tous les 2 ou 3 ans.

    Les tables de ma base sont construites de la façon suivante :

    tbRomeN1 :
    • RomeN1 : integer
    • LibRomeN1 : varchar


    tbRomeN2 :
    • RomeN1 : integer
    • RomeN2 : integer
    • LibRomeN2 : varchar


    tbRomeN3 :
    • RomeN1 : integer
    • RomeN2 : integer
    • RomeN3 : integer
    • LibRomeN3 : varchar


    Ca devrait pas etre trop difficile de les transformer en fichiers XML ou texte...

  13. #13
    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
    Toutefois, je me posee une autre question.
    Si je choisis cette solution, il faut savoir que tbRomeN3 contient près de 10 000 enregistrements.
    Le traitement en javascript pour construire la liste N3 en fonction de l'élément sélectionné dans la liste N2 sera-t'il assez rapide ?
    Existe-t'il des fonctions de filtrage de tableau performantes en Ajax ?

  14. #14
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Disons que oui, 10 000 enregistrements, ça commence à faire. Du coup l'idéal sera probablement de passer par un format type JSON plus léger et maniable en JavaScript que XML.
    Ceci dit, tu peux aussi envisager de découper ta table N3 en fonction des résultats possibles de la table N2 (tu ne vas chercher que les données qui seront utiles). Mais là encore, ça risque de devenir rapidement problématique du fait du nombre de cas à envisager.
    Cependant, tu peux aussi traiter cela de façon programmatique en PHP avec une fonction spécifique qui va scanner les différentes configurations possibles et écrire un fichier avec les données associées...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  15. #15
    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
    hummm... Le découpage me semble un poil trop pénible à réaliser et à gérer, étant donné le nombre de combinaisons possibles...

    Je crois que je vais plutôt tester la solution JSON...

    Je vous tiens au courant...

    En tout cas merci pour les infos !

    PS : connaissez-vous par hazard la fonction ajax qui permettrait de filtrer un tableau de valeurs ???

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. [MySQL] Listes SELECT en cascade, alimentées par des tables sql
    Par Lamanne dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/02/2009, 13h03
  3. trier un stringgrid alimenter par une table MySql
    Par boopix dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/03/2007, 14h28
  4. Liste déroulante par défaut (table Mysql)
    Par Nyutom dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 24/10/2006, 16h25
  5. Alimenter des tables MySQL
    Par youdev dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2006, 15h09

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