Remplir un formulaire dynamiquement en fonction d'une combobox
Résolu/Fermé
Fontainard
Messages postés
68
Date d'inscription
dimanche 16 mars 2014
Statut
Membre
Dernière intervention
24 janvier 2017
-
Modifié par Fontainard le 8/03/2016 à 02:47
jordane45 Messages postés 38342 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 12 décembre 2024 - 9 mars 2016 à 18:03
jordane45 Messages postés 38342 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 12 décembre 2024 - 9 mars 2016 à 18:03
A voir également:
- Remplir un formulaire dynamiquement en fonction d'une combobox
- Fonction si et - Guide
- Organigramme a remplir word - Guide
- Formulaire de réclamation facebook - Guide
- Comment remplir un formulaire pdf - Guide
- Comment faire un tableau croisé dynamique - Guide
2 réponses
jordane45
Messages postés
38342
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 décembre 2024
4 716
Modifié par jordane45 le 8/03/2016 à 14:40
Modifié par jordane45 le 8/03/2016 à 14:40
Bonjour,
Pour l'ajax, je te conseille d'utiliser la méthode POST à la place de GET.
Je t'ai également mis des fonctions "bien pratiques" ..
Pour ce qui est du PHP :
Déjà .. place le code de connexion à ta bdd dans un fichier à part
Comme ça.. tu n'auras qu'à l'inclure dans les pages où tu en as besoin
sans avoir à tout copier/coller en permanence.
Cela simplifie la maintenance du code... et au cas où tu changerais d'hébergeur... de ne pas
avoir à parcourir tous tes fichiers pour y faire la modification.
Par exemple :
Puis ton script ajax php :
Comme tu pourras le voir, j'ai ajouté une variable "action" qui permet de choisir l'action à réaliser ...
Cordialement,
Jordane
Pour l'ajax, je te conseille d'utiliser la méthode POST à la place de GET.
Je t'ai également mis des fonctions "bien pratiques" ..
$(document).ready(function() { var $clients = $('#clients'); var $demandes = $('#demandes'); var urlAjx = "client.php"; // Fichier ajax PHP // chargement des clients via ajax var data = {ACTION:"GET_CLIENTS"} //Ajax: sendAjx(urlAjx,data, afficherClients, function(error){alert(error);}); // à la sélection d un client dans la liste $clients.on('change', function() { var val = $(this).val(); // on récupère la valeur de la demande if(val != '') { $demandes.empty(); // on vide la liste des demandes var data = { ACTION:"GET_DEMANDES_BY_NUM_CLI" ,NUM_CLI:val }; //Ajax: sendAjx(urlAjx,data, afficherClients, function(error){alert(error);}); } }); }); // Fonctions de callBack utilisées lors des appels ajax function afficherClients(json){ var result = json.RESULT; $.each(result, function(index, value) { // on ajoute l option dans la liste $clients.append('<option value="'+ index +'">'+ value +'</option>'); }); } function afficherDemandes(json){ var result = json.RESULT; $.each(result, function(index, value) { $demandes.append('<option value="'+ index +'">'+ value +'</option>'); }); } //--------------------------------------------------------------------------------------------------------------// // FONCTIONS AJAX // Jordane45 - 02-2015 //--------------------------------------------------------------------------------------------------------------// /** Permet d'appeller la fonction AJAX *urlAjx : Fichier ajax PHP *data : Variables à transmettres *callback : Fonction appellée en cas de succès *callbackerror : Fonction appellée en cas d'erreur (optionnel ! ) *options : Variables suplémentaires à passer dans les fonction de callback si besoin (optionnel ) */ function sendAjx(urlAjx,data,callback,callbackerror,options){ var async = typeof(options)!='undefined' && typeof(options.async)!='undefined' ? options.async : true; $.ajax({ type: "POST", url: urlAjx, data: data, async: async, dataType: "json", success: function(reponse){ //debug(reponse); if (typeof callback == 'function') { callback(reponse,options); } }, error:function(jqXHR, textStatus){ var error = formatErrorMessage(jqXHR, textStatus); if (typeof callbackerror == 'function') { callbackerror(error,options); }else{ alert('error :' + error); } } }); } /** Format les messages erreurs AJAX pour les afficher */ function formatErrorMessage(jqXHR, exception) { var errorTxt=""; var err = jqXHR.responseText ; if (jqXHR.status === 0) { errorTxt = ('Not connected.\nPlease verify your network connection.'); } else if (jqXHR.status == 404) { errorTxt = ('The requested page not found. [404]'); } else if (jqXHR.status == 500) { errorTxt = ('Internal Server Error [500].'); } else if (exception === 'parsererror') { errorTxt = ('Requested JSON parse failed.'); } else if (exception === 'timeout') { errorTxt = ('Time out error.'); } else if (exception === 'abort') { errorTxt = ('Ajax request aborted.'); } else { errorTxt = ('Uncaught Error.\n' + jqXHR.responseText); } return errorTxt + " : " +err; }
Pour ce qui est du PHP :
Déjà .. place le code de connexion à ta bdd dans un fichier à part
Comme ça.. tu n'auras qu'à l'inclure dans les pages où tu en as besoin
sans avoir à tout copier/coller en permanence.
Cela simplifie la maintenance du code... et au cas où tu changerais d'hébergeur... de ne pas
avoir à parcourir tous tes fichiers pour y faire la modification.
Par exemple :
<?php //Fichier cnxBDD.php // connexion à la base de données $host = "localhost"; $dbname = "locadir"; $user = "root"; $pwd = ""; try { $bdd = new PDO("mysql:host=$host;dbname=$dbname", $user, $pwd); } catch (PDOException $e) { echo "<br>".$e."<br>"; printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e)); exit('Impossible de se connecter à la base de données.'); } ?>
Puis ton script ajax php :
Comme tu pourras le voir, j'ai ajouté une variable "action" qui permet de choisir l'action à réaliser ...
<?php //affichage des erreurs PHP error_reporting(E_ALL); //connexion à la BDD require_once 'cnxBDD.php'; //récupération "propre" des variables $num_cli = !empty($_POST['NUM_CLI']) ? $_POST['NUM_CLI'] : NULL; $ACTION = !empty($_POST['ACTION']) ? $_POST['ACTION'] : NULL; //je défini une variable de retour : $result=array(); //Choix de l'action à réaliser : switch($ACTION){ case "GET_CLIENTS": $sql = "SELECT * FROM clients ORDER BY NOM_CLI"; try{ $prepare = $bdd->prepare($sql); $res = $prepare->execute(); //on stocke le résultat dans un ARRAY $result['RESULT'] = $prepare->fetchAll(); }catch(Exception $e) { $result['ERROR'] = $e->getMessage(); } break; case "GET_DEMANDES_BY_NUM_CLI": $sql = "SELECT * FROM demandes WHERE NUM_CLI = '$num_cli' "; try{ $prepare = $bdd->prepare($sql); $res = $prepare->execute(); //on stocke le résultat dans un ARRAY $result['RESULT'] = $prepare->fetchAll(); }catch(Exception $e) { $result['ERROR'] = $e->getMessage(); } break; default: // si aucune action correspondante ! $result['RESULT'] = $_POST $result['ERROR'] = "Aucune Action ne correspond"; } // envoi du résultat au success echo json_encode($result); ?>
Cordialement,
Jordane
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
8 mars 2016 à 11:28
8 mars 2016 à 11:28
Salut,
Tu semble bien être dans la bonne direction.
Quelques petites remarques à la première lecture :
- les variables javascript n'ont pas besoin d'être précédé par un $
- le htmlentities sur une variable avant de l'utilisé en sql n'est pas correct. htmlentities doit être utilisée uniquement lors de l'affichage dans un document html, rien à voir avec la protection sql.
Ici le intval suffit pour éviter les injections sql.
Du coup quel est précisément le problème ?
As tu des erreurs js dans la console de développement de ton navigateur ?
Toujours dans la console de développement, tu peux voir le résultat retourné par tes requêtes ajax dans l'onglet Réseau. Celles-ci sont-elles correctement exécutée et est-ce qu'elles retournent bien le résultat attendu ?
Bonne journée
Tu semble bien être dans la bonne direction.
Quelques petites remarques à la première lecture :
- les variables javascript n'ont pas besoin d'être précédé par un $
- le htmlentities sur une variable avant de l'utilisé en sql n'est pas correct. htmlentities doit être utilisée uniquement lors de l'affichage dans un document html, rien à voir avec la protection sql.
Ici le intval suffit pour éviter les injections sql.
Du coup quel est précisément le problème ?
As tu des erreurs js dans la console de développement de ton navigateur ?
Toujours dans la console de développement, tu peux voir le résultat retourné par tes requêtes ajax dans l'onglet Réseau. Celles-ci sont-elles correctement exécutée et est-ce qu'elles retournent bien le résultat attendu ?
Bonne journée
Fontainard
Messages postés
68
Date d'inscription
dimanche 16 mars 2014
Statut
Membre
Dernière intervention
24 janvier 2017
9 mars 2016 à 17:02
9 mars 2016 à 17:02
Merci pour ces conseils avisés Pitet.
Le problème, c'est que ça ne fonctionne pas avec cette méthode sans pour autant me présenter d'erreurs dans la console du navigateur. Seule l'affichage de clients fonctionne, et malgré la présence de demandes qui lui sont affectés, les demandes ne sont pas affichés.
Le problème, c'est que ça ne fonctionne pas avec cette méthode sans pour autant me présenter d'erreurs dans la console du navigateur. Seule l'affichage de clients fonctionne, et malgré la présence de demandes qui lui sont affectés, les demandes ne sont pas affichés.
9 mars 2016 à 17:35
formdemande.phtml:26
._Deferred/e.resolveWith()
jquery.min.js:16
f</<.ready()
jquery.min.js:16
f</z()
jquery.min.js:16
je crois que la fonction qui appartient à clients pose problème.
Aucune erreur ne semble s'afficher mis à part "Requested JSON parse failed. : "
Pour information, la bibliothèque que j'utilise est : https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js
Une idée ? :)
9 mars 2016 à 18:03
Peux tu regarder, via la CONSOLE de ton navigateur, ce que donne l'appel à l'ajax ?
PS: pour ça.. j'utilise le plugin FIREBUG pour FIREFOX... je t'invite à en faire autant.