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

Langage PHP Discussion :

Recharger ma page après exécution du code


Sujet :

Langage PHP

  1. #21
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par moimp Voir le message
    Merci pour vos réponses.
    J'utilise assez régulièrement JavaScript par contre les quelques essais que j'ai fait avec Ajax m'ont dissuadé d'utiliser cette technique.
    Sans doute parce que tu n'as pas encore assez d'expérience, car c'est cette technique qui est utilisée notamment quand les listes sont nombreuses et avec beaucoup d'éléments de choix.
    Citation Envoyé par moimp Voir le message
    Actuellement mes listes sont alimentées par des requêtes MySQL et mon formulaire est automatiquement soumis chaque fois que l'utilisateur sélectionne une option dans une des listes. Je suis en train de complètement réécrire mon code PHP de traitement du formulaire. Si j'ai encore des difficultés, je vous donnerai mon code.
    En fait c'est exactement le même principe en Ajax, chaque fois que tu sélectionnes une option tu envoies l'option sélectionnée vers un script serveur avec une requête Ajax, et dans ce script tu fais une requête Mysql (ou autre chose suivant les besoins) pour trouver les éléments de la seconde liste qui sont retournés par ta requête et tu les insère dans le html pour construire le choix suivant, etc. En fait cela demande un peu de connaissances techniques mais cela ne change pas la philosophie de la programmation. Et c'est très souple car tu peux retourner ce que tu veux, aussi bien un tableau d'éléments pour construire une liste en javascript et l'insérer dans le html, mais tu peux aussi construire le html côté php et retourner le bloc html qu'il suffira d'insérer tel quel avec javascript en une seule ligne.

    J'ai insisté car je ne fais que des sites sur mesure en créant de A à Z toute l'interface administrateur, donc aussi tous les comportements côté visiteur, et par rapport à mes premiers sites 100% php d'il y a une vingtaine d'années, l'apport de javascript/Ajax a boosté considérablement les fonctionnalités et l'expérience utilisateur. Je veux dire que le temps d'apprentissage pour la maitrise de cette technique n'est pas du temps perdu car elle ouvre de nombreuses portes à beaucoup de niveaux, également côté backend. Après bien évidemment c'est à toi de voir, indépendamment de l'expérience utilisateur, suivant que c'est un besoin ponctuel ou que tu aies d'autres développements à faire, le choix sera sans doute différent.

  2. #22
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    Bonjour et merci ABCIWEB.

    Je vais essayer de me lancer mais je ne sais pas trop par où commencer. Ma seule expérience sérieuse a été une tentative de sauvegarde automatique de formulaire que j'ai fini par abandonner.
    Je vais commencer par regarder les différents tutoriels de ce site. Pour gagner du temps, quels seraient ceux à étudier en priorité?

  3. #23
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut Listes Liées Ajax Php
    A vrai dire je ne sais pas trop lequel te conseiller, la plupart datent de 2006... Essayes d'en trouver de plus récents.

    Personnellement j'utilise JQuery, c'est pas indispensable mais comme je fais beaucoup d'interfaces administrateurs avec des slides et autres fonctionnalités qui nécessiteraient du css chiant à faire et qui rendrait l'ensemble moins portable, c'est plus pratique (et plus rapide quand on connait jQuery).

    Je te donne un exemple générique et fonctionnel avec jQuery.

    Fichier php des selecteurs avec les requêtes Ajax :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    <?php
    session_start();
     
    // Requête pour le premier select
    //...
    $results = ['France','Angleterre'];
     
    // De préférence random_bytes si la version php le permet
    $token = function_exists('random_bytes') ? bin2hex(random_bytes(24)) : bin2hex(openssl_random_pseudo_bytes(24));
    $_SESSION['token_listes'][$token]['token'] = 1;
    ?>
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Listes liées Ajax/Jquery</title>
    <style>
    body {
    	font-family:Verdana, Geneva, sans-serif
    }
    </style>
    </head>
    <body>
    <div>
    <form id="select_multiple">
        <label>Pays:</label>
        <select name="pays">
        <option value="">Sélectionnez le pays</option>
        <?php
        foreach($results as $pays) {
        ?><option value="<?=$pays?>"><?=$pays?></option>
    	<?php }?> 
        </select>
     
        <label>Régions:</label>
        <select name="regions" disabled>
        <option value="">Sélectionnez la région</option>
        </select>
     
        <label>Villes:</label>
        <select name="villes" disabled>
        <option value="">Sélectionnez la ville</option>
        </select>
     
        <input name="token" value="<?=$token?>" type="hidden">
    </form>
    <div id="resultat">
    </div>
    <script src="http://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script>
    $(function()
    {
    	var form = $('#select_multiple')
    	,selecteurs = form.find('select')
    	,token = form.find('input[name=token]')
    	,resultat =  $("#resultat");
     
    	// Syntaxe pour créer des évènements délégués
    	form.on("change", 'select', function() {
    			// Vide le div des résultats
    			resultat.empty();
     
    			// Variables que l'on passera dans la requête ajax
    			var selection = {};
    			selection.selecteur = $(this).attr('name');
    			selection.option = $(this).val();
    			selection.token = token.val();
     
    			// Pour avoir un code générique indépendant de variables internes
    			var that = $(this)
    			,cible
    			,nextselect;
    			selecteurs.each(function (i, e) {
    				/* Si le select ($(this)) contenu dans la liste des selecteurs correspond au sélecteur utilisé (that), trouve le prochain sélecteur 
                                       et si c'est le dernier on change de cible pour afficher le contenu dans le div "resultat" au retour de la requête ajax
    				*/
    				nextselect = selecteurs[i+1];
    				if($(this).is(that)) cible = nextselect != undefined ? nextselect : resultat;
     
    				/* Si cible est défini c'est que l'on est (ou que l'on a passé) le select en cours, on selectionne la première option pour les 
    				sélecteurs suivants et on les met en disable sinon on pourrait avoir des affichages incohérents en cas de sélections successives.
    				*/
    				if (cible && nextselect != undefined) {
    					$(nextselect).find('option').first().prop('selected', true);
    					$(nextselect).prop('disabled',true);
    				}	
    			})
     
    			if(selection.option != '') createSelect(cible, selection);
    	})
     
        function createSelect(cible, selection){
     
    		$.ajax({
      		method: "POST",
    		// Destination de la requête ajax
      		url: "listes_liees_ajax.php",
      		data: selection
    		})
      		.done(function(result) {
    			// Met le sélecteur enable
    			if (cible.tagName == 'SELECT') $(cible).prop('disabled',false);
    			// Affiche le résultat
    			$(cible).html(result);
      		});
    	}
    });
    </script>
    </body>
    </html>
    Comme tu peux le voir, c'est finalement pas très long. Après c'est certain qu'il faut être un peu habitué car il faut prévoir les interactions des utilisateurs.

    J'ai joué avec les propriétés "disable" pour rendre actif ou non les différents sélecteurs, mais on pourrait tout aussi bien les cacher et les afficher de la même manière en utilisant les css "display:none" ou "display:inline-block" à la place d'utiliser les propriétés "disable".

    Le code est générique, tu peux ajouter autant de sélecteurs que tu veux avec les valeurs que tu veux. Au final il n'y a que deux variables (id) qui servent au code javascript "#select_multiple" et "#resultat", et bien sûr l'input name="token" qui sert de... token pour être certain que le fichier de destination de la requête ajax "listes_liees_ajax.php" (cf url: "listes_liees_ajax.php") ne pourra être appelé qu'en passant par ton formulaire.

    Voici maintenant le fichier php de destination de la requête ajax que j'ai nommé "listes_liees_ajax.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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    <?php
    session_start();
    $token = isset($_POST['token']) ? $_POST['token'] : null;
    if(!isset($_SESSION['token_listes'][$token]['token'])) exit('token invalide');
     
    $selecteur = isset($_POST['selecteur']) ? $_POST['selecteur'] : null;
    $option = isset($_POST['option']) ? $_POST['option'] : null;
     
    if($selecteur == 'pays')
    {
    	// Requête select avec la variable $option pour trouver les régions et construire les options	
    	// Je fais un équivalent avec un if et je fais le choix ici de retourner directement du html
    	if($option == 'France')
    	{
    	?>
            <option value="">Sélectionnez la région</option>
            <option value = "Aquitaine" >Aquitaine</option>
            <option value = "Auvergne" >Auvergne</option>
        <?php }
    	else if ($option == 'Angleterre')
    	{ ?>
            <option value="">Sélectionnez la région</option>
    	<option value = "Angleterre du Sud-Est" >Angleterre du Sud-Est</option>
        	<option value = "Angleterre du Sud-Ouest" >Angleterre du Sud-Ouest</option>
    	<?php }
    	exit;
    }
    else if($selecteur == 'regions')
    {
    	// Requête select avec la variable $option pour trouver les villes et construire les options
    	// Je fais un équivalent avec un swicth pour retourner quelque chose
    	$result = ''; 
    	switch ($option)
    	{
    		case 'Aquitaine' : $result = '<option value="">Sélectionnez la ville</option><option value="Bordeaux">Bordeaux</option><option value="Pau">Pau</option>';
    		break;
    		case 'Auvergne' : $result = '<option value="">Sélectionnez la ville</option><option value="Clermont-Ferrand">Clermont-Ferrand</option><option value="Moulin">Moulin</option>';
    		break;
    		case 'Angleterre du Sud-Est' : $result = '<option value="">Sélectionnez la ville</option><option value="Southampton">Southampton</option><option value="Portsmouth">Portsmouth</option>';
    		break;
    		case 'Angleterre du Sud-Ouest' : $result = '<option value="">Sélectionnez la ville</option><option value="Bristol">Bristol</option><option value="Plymouth">Plymouth</option>';
    		break;
    	}
    	// Je retourne le html dans le exit
    	exit($result);
    }
    else if($selecteur == 'villes')
    {
    	// Requête select avec la variable $option pour retourner ce que l'on veut
     
    	$result = '<p style="font-size:2em;color:green;">Vous avez sélectionné '.$option.' et c\'est très bien</p>';
    	exit($result);
    }
    ?>
    Comme tu l'auras compris, en fonction des variables tu fais des requêtes pour construire les options des sélect. Et en résultat du dernier select tu affiches le contenu que tu veux dans le bloc de résultat.

    Il y aurait d'autres manières de faire bien entendu. Ajax est puissant car tu pourrais aussi renvoyer un contenu mixte avec la fonction php "json_encode" que je n'ai pas utilisée puisqu'on ne renvoie ici que du html.

    Normalement c'est prêt à l'emploi, il suffit de placer ces deux fichiers au même niveau de ton répertoire et de nommer le second tel qu'indiqué dans le paramètre "url" de la requête ajax.

    Personnellement en production je préfère rapatrier le fichier JQuery sur mon serveur plutôt que faire un appel externe, je n'aime pas être dépendant de sources externes quand je peux m'en passer, c'est plus sécure.

    A noter que durant le développement Ajax on utilise très souvent la console du navigateur, l'inspecteur de code pour contrôler le html créé dynamiquement, et aussi l'onglet "réseau" pour voir le contenu de la requête Ajax et sa réponse.

    EDIT Concernant le code php il va peut être te manquer des variables pour certaines requêtes puisqu'à chaque fois je n'envoie que le nom du select et son option. Tu pourrais t'en tirer en enregistrant les variables en session, par exemple avec $_SESSION['token_listes'][$token]['pay'] = $option; à l'intérieur de la condition if($selecteur == 'pays'), et de même dans les conditions suivantes.

  4. #24
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 369
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    étant comme moimp totalement ignare au sujet de Ajax, j'ai fait une petite recherche de tuto. J'ai trouvé sur DVP https://gael-donat.developpez.com/web/intro-ajax/. Certes, il a été écrit le 15 septembre 2006, mais a été mis à jour le 4 décembre 2019. Donc, pas si vieux...

    D'autre part, ABCIWEB, tu dis préférer intégrer le source de jquery sur le serveur plutôt qu'utiliser un lien vers un CDN. Hors, si on veut se servir de Bootstrap, on trouve dans https://getbootstrap.com/docs/4.3/ge.../introduction/ ce code pour démarrer :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
    C'est pas bien, selon toi ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  5. #25
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    1/ Je n'ai pas l'impression que les exemples fonctionnent, les derniers je ne sais pas puisqu'ils nécessitent de créer une table, mais pour les premiers je n'ai même pas "bonjour monde" qui devrait s'afficher.

    2/ Oui tout le monde te conseilleras d'utiliser des liens externes pour des raisons de vitesse, car comme ces fichiers sont toujours les mêmes et sont mis en cache, il est probable que l'utilisateur n'ait pas à les charger car il est possible qu'il les ait déjà chargé en visitant d'autres sites. Mais je préfère la sécurité à la vitesse, tant que mon serveur n'est pas en panne rien n'empêchera de charger ma page, et comme je fais un système de cache dans mon .htaccess le fichier ne sera chargé qu'une fois. Après je ne charge que jQuery, rien d'autre donc c'est quand même assez léger. Si tu as plusieurs lib javascript à charger le gain en vitesse serait sans doute plus sensible. Cela dit tu as raison, les recommandations générales sont de faire appel à des liens externes mais je ne les suis pas toutes.

    En fait comme je le disais cela peut varier selon les cas, par exemple si je ne pouvais pas faire de système de cache sur mon serveur ce serait plus embêtant, de même si je faisais appel à de nombreuses sources, et dans l'absolu il y a très peu de chance que les liens externes tombent en panne. Mais comme cela m'est déjà arrivé une fois (pas pour Jquery) j'ai adopté une position radicale, et comme je suis très bien placé quand je teste la vitesse de chargement de mes pages j'ai gardé ce principe d'être le moins dépendant possible tant que ce n'est pas réellement handicapant pour la vitesse.

  6. #26
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    J'ai modifié les codes de mon premier message pour définir le token et ajouté un EDIT car je me suis aperçu qu'il manquait probablement des variables pour faire les requêtes. Avec cette petite modification il est facile d'enregistrer les variables en session et ne pas avoir besoin de modifier le code javascript.

    On peut aussi faire autrement en javascript et renvoyer toutes les valeurs des sélecteurs. Côté php il faudra faire des conditions supplémentaires pour ne pas rentrer dans les conditions précédentes quand on dépasse la première. On pourrait faire quelques chose comme ça :

    Fichier "listes_liees.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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    <?php
    session_start();
     
    // Requête pour le premier select
    //...
    $results = ['France','Angleterre'];
     
    // De préférence random_bytes si la version php le permet
    $token = function_exists('random_bytes') ? bin2hex(random_bytes(24)) : bin2hex(openssl_random_pseudo_bytes(24));
    $_SESSION['token_listes'][$token]['token'] = 1;
    ?>
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Ajax/Jquery</title>
    <style>
    body {
    	font-family:Verdana, Geneva, sans-serif
    }
    </style>
    </head>
    <body>
    <div>
    <form id="select_multiple">
        <label>Pays:</label>
        <select name="pays">
        <option value="">Sélectionnez le pays</option>
        <?php
        foreach($results as $pays) {
        ?><option value="<?=$pays?>"><?=$pays?></option>
    	<?php }?> 
        </select>
     
        <label>Régions:</label>
        <select name="regions" disabled>
        <option value="">Sélectionnez la région</option>
        </select>
     
        <label>Villes:</label>
        <select name="villes" disabled>
        <option value="">Sélectionnez la ville</option>
        </select>
     
        <input name="token" value="<?=$token?>" type="hidden">
    </form>
    <div id="resultat">
    </div>
    <script src="http://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script>
    $(function()
    {
    	var form = $('#select_multiple')
    	,selecteurs = form.find('select')
    	,token = form.find('input[name=token]')
    	,resultat =  $("#resultat");
     
    	// Syntaxe pour créer des évènements délégués
    	form.on("change", 'select', function() {
    			// Vide le div des résultats
    			resultat.empty();
     
    			// Pour avoir un code générique indépendant de variables internes
    			var that = $(this)
    			,cible
    			,nextselect;
    			selecteurs.each(function (i, e) {
    				/* Si le select ($(this)) contenu dans la liste des selecteurs correspond au sélecteur utilisé (that),
    				trouve le prochain sélecteur et si c'est le dernier on change de cible pour afficher le contenu au retour de la requête ajax
    				*/
    				nextselect = selecteurs[i+1];
    				if($(this).is(that)) cible = nextselect != undefined ? nextselect : resultat;
     
    				/* Si cible est défini c'est que l'on est (ou que l'on a passé) le select en cours, on selectionne la première option pour les 
    				sélecteurs suivants pour avoir une valeur vide et on les met en disable sinon on aurait des affichages ou des résultas incohérents 
    				en cas de sélections successives.
    				*/
    				if (cible && nextselect != undefined) {
    					$(nextselect).find('option').first().prop('selected', true);
    					$(nextselect).prop('disabled',true);
    				}	
    			})
     
    			/* Variables du formulaire que l'on passera dans la requête ajax (noter qu'il existe aussi serializeArray() pour les checkbox par exemple 
    			ou des champs avec la notation tableau). Il est IMPORTANT de placer cette ligne APRES le traitement précédent qui vide les sélecteurs suivants.
    			*/
    			var selection = form.serialize();
     
    			if($(this).val() != '') createSelect(cible, selection);
    	})
     
        function createSelect(cible, selection){
     
    		$.ajax({
      		method: "POST",
    		// Destination de la requête ajax
      		url: "listes_liees_ajax.php",
      		data: selection
    		})
      		.done(function(result) {
    			// Met le sélecteur enable
    			if (cible.tagName == 'SELECT') $(cible).prop('disabled',false);
    			// Affiche le résultat
    			$(cible).html(result);
      		});
    	}
    });
    </script>
    </body>
    </html>

    Fichier "listes_liees_ajax.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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <?php
    session_start();
     
    $token = isset($_POST['token']) ? $_POST['token'] : null;
    if(!isset($_SESSION['token_listes'][$token]['token'])) exit('token invalide');
     
    $pays = isset($_POST['pays']) ? trim($_POST['pays']) : null;
    $region = isset($_POST['regions']) ? trim($_POST['regions']) : null;
    $ville = isset($_POST['villes']) ? trim($_POST['villes']) : null;
     
    // array_filter sans argument supprime les valeurs vides ou nulles
    $selects = array_filter([$pays,$region,$ville]);
     
    if(isset($pays) && count($selects) == 1)
    {
    	// Requête select avec la variable $pays pour trouver les régions et construire les options	
    	// Je fais un équivalent avec un if et je fais le choix ici de retourner directement du html
    	if($pays == 'France')
    	{
    	?>
            <option value="">Sélectionnez la région</option>
            <option value = "Aquitaine" >Aquitaine</option>
            <option value = "Auvergne" >Auvergne</option>
        <?php }
    	else if ($pays == 'Angleterre')
    	{ ?>
            <option value="">Sélectionnez la région</option>
    		<option value = "Angleterre du Sud-Est" >Angleterre du Sud-Est</option>
        	<option value = "Angleterre du Sud-Ouest" >Angleterre du Sud-Ouest</option>
    	<?php }
    	exit;
    }
    else if(isset($region) && count($selects) == 2)
    {
    	// Requête select avec les variables $pays et $region pour trouver les villes et construire les options
    	// Je fais un equivalent avec un swicth pour retourner quelque chose
    	$result = ''; 
    	switch ($region)
    	{
    		case 'Aquitaine' : $result = '<option value="">Sélectionnez la ville</option><option value="Bordeaux">Bordeaux</option><option value="Pau">Pau</option>';
    		break;
    		case 'Auvergne' : $result = '<option value="">Sélectionnez la ville</option><option value="Clermont-Ferrand">Clermont-Ferrand</option><option value="Moulin">Moulin</option>';
    		break;
    		case 'Angleterre du Sud-Est' : $result = '<option value="">Sélectionnez la ville</option><option value="Southampton">Southampton</option><option value="Portsmouth">Portsmouth</option>';
    		break;
    		case 'Angleterre du Sud-Ouest' : $result = '<option value="">Sélectionnez la ville</option><option value="Bristol">Bristol</option><option value="Plymouth">Plymouth</option>';
    		break;
    	}
    	// Je retourne le html dans le exit
    	exit($result);
    }
    else if(isset($ville) && count($selects) == 3)
    {
    	// Requête select avec les variables $pays, $region et $ville pour retourner ce que l'on veut
     
    	$result = '<p style="font-size:2em;color:green;">Vous avez sélectionné '.$ville.' et c\'est très bien</p>';
    	exit($result);
    }
    ?>

  7. #27
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    Tu peux regarder ce tutoriel qui répond à ta question et à la mienne.

  8. #28
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 369
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Je suppose que ton conseil est pour moi ; je l'avais déjà signalé y a 3 jours
    Citation Envoyé par laurentSc Voir le message
    Bonjour,

    étant comme moimp totalement ignare au sujet de Ajax, j'ai fait une petite recherche de tuto. J'ai trouvé sur DVP https://gael-donat.developpez.com/web/intro-ajax/. Certes, il a été écrit le 15 septembre 2006, mais a été mis à jour le 4 décembre 2019. Donc, pas si vieux...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  9. #29
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    Bonjour,
    Je reviens parce que j'avais zappé la deuxième page de la discussion.
    @ABCIWEB: Je ne peux pas tout apprendre en même temps et j'aimerais savoir si tu as une version sans JQuery pour mieux comprendre.
    @laurentSc: Je n'avais pas vu ton lien vers le tuto. Tu remarqueras qu'il ne s'agit pas du même que le mien qui montre un exemple de listes liées.

    Je n'arrive pas à faire fonctionner mon application avec l'exemple que je donne en #27 et j'ai posté une autre discussion après un blocage sur mon script qui n'a toujours pas de réponses. C'est pourquoi j'aimerais avoir un exemple en JavaScript pur en utilisant des écouteurs comme j'ai commencé à le faire.

  10. #30
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 369
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par moimp Voir le message
    @laurentSc: Je n'avais pas vu ton lien vers le tuto. Tu remarqueras qu'il ne s'agit pas du même que le mien qui montre un exemple de listes liées.
    Je les avais pas regardés (même le mien !).

    2 constats après les avoir survolés :

    - ils datent tous les 2 de 2006 et ont été mis à jour tous les 2 en décembre 2019

    - ils utilisent tous les 2 les fonctions PHP mysql_xxx qui sont retirées depuis PHP7 (on en est à PHP8).
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  11. #31
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    J'ai fait les mêmes constats. En ce qui concerne mysql_*, il est facile de transposer avec PDO par exemple.

  12. #32
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 369
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    pareil ; jamais accroché à MYSQLI mais oui pour PDO. Et depuis quelques temps, j'utilise (en POO), la super classe de rawsrc : https://github.com/rawsrc/PDOPlusPlus ou https://www.developpez.net/forums/bl...dutiliser-pdo/ (il l'a publiée juste quelques jours avant de quitter DVP (début avril 2020 et ex-modo)).
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  13. #33
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    Maintenant mon souci est de déboguer sur deux fichiers à la fois:
    Le fichier x.js et le fichier AJAX.php. En effet dans la console, il est difficile de voir ce qui se passe de façon asynchrone sur les deux fichiers, même en utilisant la console et le réseau.

  14. #34
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par moimp Voir le message
    Maintenant mon souci est de déboguer sur deux fichiers à la fois:
    Le fichier x.js et le fichier AJAX.php. En effet dans la console, il est difficile de voir ce qui se passe de façon asynchrone sur les deux fichiers, même en utilisant la console et le réseau.
    Est-ce que tu arrives à faire fonctionner mon code. Il fonctionne chez moi donc si tu n'arrives pas à le faire fonctionner c'est sans doute que tu as un problème d'implémentation sur ton site qui n'as peut-être rien à voir avec le code javascript et le fichier php... cela permettrait de mieux comprendre l'origine du problème.

    En fait tu n'as rien à apprendre pour le faire fonctionner et peu de chose à faire pour l'adapter puisqu'il te suffit de mettre un id="select_multiple" dans le tag du formulaire et un "id="resultat" dans le bloc des résultats ou sinon tu peux changer ces noms dans le code javascript. Et si ça bloque à cause du token, dans un premier temps tu peux supprimer cette ligne de contrôle côté php.

  15. #35
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    Oui, ton code (#26) fonctionne parfaitement et je pourrais sûrement l'adapter à mon besoin mais en #29, j'ai écrit ceci:
    Citation Envoyé par moimp Voir le message
    @ABCIWEB: Je ne peux pas tout apprendre en même temps et j'aimerais savoir si tu as une version sans JQuery pour mieux comprendre.
    ...
    j'aimerais avoir un exemple en JavaScript pur en utilisant des écouteurs comme j'ai commencé à le faire.
    De plus, j'ai 4 niveaux de sélections et je voudrais écrire un code qui fonctionne avec des boucles ou des appels de fonctions, aussi bien côté PHP que JS. C'est pourquoi j'aimerais apprendre à maîtriser AJAX et ses mécanismes comme tu m'en as donné envie. En fait, je commence à m'en sortir mais j'ai des difficultés à mettre au point le fichier AJAX car on ne voit pas ce qui se passe.
    J'ai actuellement 4 fichiers:
    1. Un contrôleur customerActivities.php
    2. Une vue formActivities.php
    3. Un fichier customerActivitiesHandler.js pour le JS
    4. Un fichier customerActivitiesAjax.php

    Le rendu initial est obtenu par les deux premiers fichiers et donne cet extrait:
    Code html : 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
    <!DOCTYPE html>
    <html lang="fr">
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    	</head>
     
    	<body>
    <form method="post" name="tabForm" action="http://sirep.proginet.local/frontend/mainFormHandler.php" data-tab="activity">
    	<input type="hidden" id="id0" name="id" value="3011" >
    	<div class="formFlex">
    		<fieldset><legend>Activités répertoriées</legend>
    			<p class="note">
    				Ici vous pouvez sélectionner des activités selon la nomenclature NAF de l'INSEE (rév. 2) 
    				ce qui peut vous permettre de rechercher les entreprises qui ont la même activité.<br>
    				Ces codes sont indépendants de celui du registre du commerce. Ce sont ceux qui correpondent
    				le mieux aux activités du client.
    			</p>
    			<fieldset><legend>Zone d'édition&nbsp;: Sélection d'une activité</legend>
    				<label for="naf1">Section</label><select name='naf[1]' id='naf1' required='required'><option value='' label='&lt; ---- &gt;'></option><option value='1'>SECTION A - AGRICULTURE, SYLVICULTURE ET PÊCHE</option><option value='2'>SECTION B - INDUSTRIES EXTRACTIVES</option><option value='3'>SECTION C - INDUSTRIE MANUFACTURIÈRE</option></select><br>
    				<label for="naf2">Division</label><select name='naf[2]' id='naf2'><option value='' label='&lt; ---- &gt;'></option></select><br>
    				<label for="naf3">Groupe</label><select name='naf[3]' id='naf3'><option value='' label='&lt; ---- &gt;'></option></select><br>
    				<label for="naf4">Activité</label><select name='naf[4]' id='naf4'><option value='' label='&lt; ---- &gt;'></option></select><br>
    			</fieldset>
    		</fieldset>
    	</div>
    </form>
     
    <script type="module" src="../js/customerActivitiesHandler.js"></script>
    Dans leur état de développement actuel, le fichier JS est comme ceci:
    Code JS : 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
    const
    	nafs	= document.querySelectorAll("[id*='naf']")
    	,root	= window.location.origin
    	;
     
    console.log(nafs);
    nafs[2].disabled=false;
     
    function handleChange(lastList) {
    	var xhr = new XMLHttpRequest()
    		;
     
    	console.log(lastList.value); // 2 pour section B, 3 pour section C
    	xhr.onreadystatechange = function(){
    		if (xhr.readyState == 4 && xhr.status == 200){
    			console.log(xhr.responseText); // ne renvoie rien
    		}
    	}
    	xhr.open('POST', root+'/frontend/customerActivitiesAjax.php', true);
    	xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // necessary for postmode
    	console.log(lastList.name, lastList.value); // renvoie naf[1], la valeur sélectionnée
    	xhr.send(lastList.name+'='+lastList.value);
    }
     
    if (nafs.length){
    	nafs.forEach(function(curNaf){
    		curNaf.addEventListener('change', function(e){
    			handleChange(curNaf);
    		}, false );
    	});
    }
    Fichier customerActivitiesAjax.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    require_once('../config.php');
    require_once('../model/model.php');
     
    if (isset($_POST['naf'][1])) {
    	$res = getNAF('fr', 2, $_POST['naf'][1]);
    }

  16. #36
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Il ne renvoie rien ton code php dans la requête ajax. Si tu regardes mon code, soit je fais afficher du code html dans ma première condition en fermant la balise php { ?> et je termine par un exit pour être certain de sortir à la fin des conditions, soit je mets ma variable dans un exit ce qui va l'afficher en sortant du code. Dans ton code il n'y a aucun affichage, tu définis juste une variable mais tu ne l'affiche pas. A la fin, fais : exit($res);.

  17. #37
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    J'ai séparé mon code qui était inclus dans un code plus long et qui provoquait une erreur. J'ai progressé dans la compréhension d'AJAX. J'ai donc pu avancer.
    Il me reste une question qui ne sera sans doute pas la dernière.
    Au stade de développement actuel, j'ai le code suivant:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    const
    	nafs	= document.querySelectorAll("[id*='naf']")
    	,root	= window.location.origin
    	;
     
    console.log(nafs);
     
    function handleChange(lastList, idx) {
    	var xhr = new XMLHttpRequest()
    		;
     
    	xhr.onreadystatechange = function(){
    		if (xhr.readyState == 4 && xhr.status == 200){
    			console.log(xhr.responseText);
    			nafs[idx].innerHTML = xhr.responseText;
    		}
    	}
    	xhr.open('POST', root+'/frontend/customerActivityAjax.php', true);
    	xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // necessary for postmode
    	xhr.send(lastList.name+'='+lastList.value);
    	//xhr.send();
    }
     
    if (nafs.length){
    	nafs.forEach(function(curNaf, index){
    		curNaf.addEventListener('change', function(e){
    			handleChange(curNaf,index+1);
    		}, false );
    	});
    }
    Ce code fonctionne avec un argument dans le send(). Il ne fonctionne pas sans argument. Pourtant d'après la doc MDN, les arguments ne sont pas nécessaires avec la méthode post.
    Mon code PHP utilise $_POST['naf'][1] mais je ne vois pas le lien avec l'argument de send(), ni comment utiliser cet argument.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Recharger la page après fonction php
    Par leroidje dans le forum Langage
    Réponses: 3
    Dernier message: 08/10/2009, 16h31
  2. [javascript/html] Recharger une page après choix dans liste
    Par pitchoblack dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/04/2008, 16h58
  3. Réponses: 6
    Dernier message: 19/02/2008, 11h45
  4. [javascript/php]Recharger une page après choix dans liste déroulante
    Par eyango dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/01/2008, 13h34
  5. Rechargement de page après envoi de fichier
    Par marieR dans le forum Struts 1
    Réponses: 11
    Dernier message: 30/01/2007, 14h40

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