liste déroulantes dynamiques liées et insertion dans BDD (PHP/SQL)

liste déroulantes dynamiques liées et insertion dans BDD (PHP/SQL) - PHP - Programmation

Marsh Posté le 03-03-2010 à 10:55:09    

Bonjour,
 
je vous explique mon problème.
 
J'ai créé un formulaire en intégrant des listes dynamiques liées. Ces listes sont constituées en appelant le contenu de 2 tables ("région" et "département" ) de ma BDD. La 2ème liste s'affiche en fonction du choix fait dans la 1ère. Je récupère les variables des listes et insère le contenu dans une 3ème table "annuaire" dans ma BDD. Jusque là, tout est ok.
 
Voici mon code :

Code :
  1. <?php
  2. /* Requête SQL de récupération des données de la première liste */
  3. $sql = "SELECT `id_region` AS idr, `region` ".
  4.        "FROM `region` ".
  5.        "ORDER BY `id_region`;";
  6. /* Connexion et exécution de la requête */
  7. $connexion = mysql_connect($serveur, $admin, $mdp);
  8. if($connexion != false)
  9. {
  10.     $choixbase = mysql_select_db($base, $connexion);
  11.     $recherche = mysql_query($sql, $connexion);
  12.     /* Création du tableau PHP des valeurs récupérées */
  13.     $regions = array();
  14.     /* Index du département par tableau régional */
  15.     $id = 0;
  16.     while($ligne = mysql_fetch_assoc($recherche))
  17.     {
  18.         $regions[$ligne['idr']] = $ligne['region'];
  19.     }
  20.    
  21. ?>
  22. <form name="form" action="action.php" method="post" style="color: #333; font-size:14px;">
  23. <table width="650" border="0" cellspacing="3">
  24.  
  25. <tr class="bleu">
  26. <td> Région :
  27.     <select name="Zregion" id="region" onChange="getSecteur1(this.value);">
  28.       <option value="vide">- - - Choisissez une région - - -</option>
  29.     <?php
  30.     /* Construction de la première liste : on se sert du tableau PHP */
  31.     foreach($regions as $nr => $nom)
  32.     {
  33.         ?>
  34.     <option value="<?php echo($nr); ?>"><?php echo($nom); ?></option>
  35. <?php
  36.     }
  37.     ?>
  38.     </select>
  39.     <!-- on met un bloc avec un id ou va s'insérer le code de
  40.          la seconde liste déroulande -->
  41.   <span id="blocDepartements">Départements</span><br />
  42.   <? $rq="Select region from region where (id_region = '".$nr."')"; ?>
  43.   </td></tr></table>
  44. </form>


 
la liste département est générée par un fichier PHP (et un fichier JS également) :

Code :
  1. <?php
  2. /**
  3. * Code qui sera aeeplé par un objet XHR et qui
  4. * retournera la liste déroulante des départements
  5. * correspondant à la région sélectionnée.
  6. */
  7. /* Paramètres de connexion */
  8. $serveur = "localhost";
  9. $admin   = "*****";
  10. $mdp     = "*****";
  11. $base    = "*****";
  12. /* On récupère l'identifiant de la région choisie. */
  13. $idr = isset($_GET['idr']) ? $_GET['idr'] : false;
  14. /* Si on a une région, on procède à la requête */
  15. if(false !== $idr)
  16. {
  17.     /* Cération de la requête pour avoir les départements de cette région */
  18.     $sql2 = "SELECT `id_departement`, `departement`".
  19.             " FROM `departement`".
  20.             " WHERE `id_region` = ". $idr ."".
  21.             " ORDER BY `id_departement`;";
  22.     $connexion = mysql_connect($serveur, $admin, $mdp);
  23.     mysql_select_db($base, $connexion);
  24.     $rech_dept = mysql_query($sql2, $connexion);
  25.     /* Un petit compteur pour les départements */
  26.     $nd = 0;
  27.     /* On crée deux tableaux pour les numéros et les noms des départements */
  28.     $code_dept = array();
  29.     $nom_dept = array();
  30.     /* On va mettre les numéros et noms des départements dans les deux tableaux */
  31.     while(false != ($ligne_dept = mysql_fetch_assoc($rech_dept)))
  32.     {
  33.         $code_dept[] = $ligne_dept['id_departement'];
  34.         $nom_dept[]  = $ligne_dept['departement'];
  35.         $nd++;
  36.     }
  37.     /* Maintenant on peut construire la liste déroulante */
  38.     $liste = "";
  39.     $liste .= '<select name="Zdepartement" id="departement">'."\n";
  40.     for($d = 0; $d < $nd; $d++)
  41.     {
  42.         $liste .= '  <option value="'. $code_dept[$d] .'">'. htmlentities($nom_dept[$d]) .'</option>'."\n";
  43.     }
  44.     $liste .= '</select>'."\n";
  45.     /* Un petit coup de balai */
  46.     mysql_free_result($rech_dept);
  47.     /* Affichage de la liste déroulante */
  48.     echo($liste);
  49. }
  50. /* Sinon on retourne un message d'erreur */
  51. else
  52. {
  53.     echo("<p>Une erreur s'est produite. La région sélectionnée comporte une donnée invalide.</p>\n" );
  54. }
  55. ?>


 
Mon problème est le suivant : en récupérant les valeurs "Zregion" et "Zdepartement" dans les listes, ce sont les id qui sont enregistrés dans ma table et non pas les noms des départements et régions.
La question que je me pose et sur laquelle je demande votre aide est : comment faire pour enregistrer les noms à la place des id ?
 
J'ai pensé à une requete du genre :

Code :
  1. $rq="Select region from region where (id_region = '".$nr."')";

qui permettrait de changer l'id en nom mais 1: je ne suis pas sur qu'elle soit correcte et 2: je ne sais pas où la placer.
 
 
Merci pour votre aide

Reply

Marsh Posté le 03-03-2010 à 10:55:09   

Reply

Marsh Posté le 03-03-2010 à 11:50:19    

Antho03 a écrit :


J'ai pensé à une requete du genre :

Code :
  1. $rq="Select region from region where (id_region = '".$nr."')";

qui permettrait de changer l'id en nom mais 1: je ne suis pas sur qu'elle soit correcte et 2: je ne sais pas où la placer.


Sûrement un peu avant ton code qui enregistre en base de données. On peut l'avoir d'ailleurs ce code ?

Reply

Marsh Posté le 03-03-2010 à 11:58:32    

Tirkyth a écrit :


Sûrement un peu avant ton code qui enregistre en base de données. On peut l'avoir d'ailleurs ce code ?


 
Merci pour ta réponse.
 
Voilà le code d'action.php :

Code :
  1. <?php
  2. echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n" );
  3. /* Variables de connexion */
  4. $serveur = "localhost";
  5. $admin   = "*****";
  6. $mdp     = "*****";
  7. $base    = "*****";
  8. //connexion à la base
  9. @mysql_connect($serveur, $admin, $mdp)
  10. or die("Impossible de se connecter au serveur de bases de données.".mysql_error());
  11. //sélection de la base
  12. @mysql_select_db($base)
  13. or die("Impossible de se connecter à la base de données.".mysql_error());
  14. $Zregion = htmlentities($_POST['Zregion']);
  15. $Zdepartement = htmlentities($_POST['Zdepartement']);
  16. /* Enregistrement du formulaire dans la BDD */
  17. $annuaire = mysql_query("insert into annuaire (region, departement) values('".$Zregion."','".$Zdepartement."')" );
  18. echo "inscription effectuée";
  19. ?>


Message édité par Antho03 le 03-03-2010 à 11:58:46
Reply

Marsh Posté le 03-03-2010 à 13:23:51    

Merci.
 
Est-ce que le problème ne serait pas résolu en faisant ces manipulations :
dans ta première portion de code de ton premier post, remplacer la ligne 36 par

Code :
  1. <option value="<?php echo($nom); ?>"><?php echo($nom); ?></option>


Et dans la seconde portion, remplacer la ligne 43 par

Code :
  1. $liste .= '  <option value="'. $nom_dept[$d] .'">'. htmlentities($nom_dept[$d]) .'</option>'."\n";

Reply

Marsh Posté le 03-03-2010 à 14:44:16    

Tirkyth a écrit :

Merci.
 
Est-ce que le problème ne serait pas résolu en faisant ces manipulations :
dans ta première portion de code de ton premier post, remplacer la ligne 36 par

Code :
  1. <option value="<?php echo($nom); ?>"><?php echo($nom); ?></option>


Et dans la seconde portion, remplacer la ligne 43 par

Code :
  1. $liste .= '  <option value="'. $nom_dept[$d] .'">'. htmlentities($nom_dept[$d]) .'</option>'."\n";



 
J'ai mis le code que tu m'as donné. Avec celui-ci, au choix de la région (1ère liste déroulante), cela génère une 2ème liste vide.

Reply

Marsh Posté le 03-03-2010 à 17:00:08    

Ouais, en effet ... C'est normal en fait. T'as besoin de l'ID pour renvoyer ta 2ème liste, or moi je t'ai fait enlever l'ID pour mettre directement le nom dans les valeurs du formulaire afin que ça soit enregistré directement. Donc remet comme c'était avant  :D . En effet, tu vas devoir faire comme tu disais des requêtes en plus.
 
On en vient donc au code tu m'as transmis après la première réponse, celui chargé d'enregistrer :
 

Code :
  1. <?php
  2. echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n" );
  3. /* Variables de connexion */
  4. $serveur = "localhost";
  5. $admin   = "*****";
  6. $mdp     = "*****";
  7. $base    = "*****";
  8. //connexion à la base
  9. @mysql_connect($serveur, $admin, $mdp)
  10. or die("Impossible de se connecter au serveur de bases de données.".mysql_error());
  11. //sélection de la base
  12. or die("Impossible de se connecter à la base de données.".mysql_error());
  13.  
  14. /* Récupération des noms de région et département selon les ID */
  15. $Zregion = null;
  16. $query = "SELECT region FROM region WHERE id_region = ".intval($_POST['Zregion']);
  17. $result = mysql_query($query);
  18. if ($ligne = mysql_fetch_assoc($result))
  19. {
  20.  $Zregion = $ligne['region'];
  21. }
  22.  
  23. $Zdepartement = null;
  24. $query = "SELECT departement FROM departement WHERE id_departement = ".intval($_POST['Zdepartement']);
  25. $result = mysql_query($query);
  26. if ($ligne = mysql_fetch_assoc($result))
  27. {
  28.  $Zdepartement = $ligne['departement'];
  29. }
  30.  
  31. /* Enregistrement du formulaire dans la BDD */
  32. $annuaire = mysql_query("insert into annuaire (region, departement) values('".$Zregion."','".$Zdepartement."')" );
  33. echo "inscription effectuée";
  34. ?>


 
Voilà, essaye avec ça, et dis moi ce que ça donne.

Reply

Marsh Posté le 05-03-2010 à 15:10:07    

Merci pour ta réponse.
 
Je viens de tester, ça ne fonctionne pas. Ca envoit toujours les id dans la BDD. Mais je pense pas qu'on soit bien loin de ce qu'on cherche.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed