Aller au contenu

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


Sujets conseillés

Posté

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 le code de mon formulaire :

 <?php
/* Requête SQL de récupération des données de la première liste */
$sql = "SELECT `id_region` AS idr, `region` ".
"FROM `region` ".
"ORDER BY `id_region`;";
/* Connexion et exécution de la requête */
$connexion = mysql_connect($serveur, $admin, $mdp);
if($connexion != false)
{
$choixbase = mysql_select_db($base, $connexion);
$recherche = mysql_query($sql, $connexion);
/* Création du tableau PHP des valeurs récupérées */
$regions = array();
/* Index du département par tableau régional */
$id = 0;
while($ligne = mysql_fetch_assoc($recherche))
{
$regions[$ligne['idr']] = $ligne['region'];
}

?>

<form name="form" action="action.php" method="post" style="color: #333; font-size:14px;">

<table width="650" border="0" cellspacing="3">

<tr class="bleu">
<td> Région :
<select name="Zregion" id="region" onChange="getSecteur1(this.value);">
<option value="vide">- - - Choisissez une région - - -</option>
<?php
/* Construction de la première liste : on se sert du tableau PHP */
foreach($regions as $nr => $nom)
{
?>
<option value="<?php echo($nr); ?>"><?php echo($nom); ?></option>
<?php
}
?>
</select>
<!-- on met un bloc avec un id ou va s'insérer le code de
la seconde liste déroulande -->
<span id="blocDepartements">Départements</span><br />
<? $rq="Select region from region where (id_region = '".$nr."')"; ?>
</td></tr></table>
</form>

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

 <?php
/**
* Code qui sera aeeplé par un objet XHR et qui
* retournera la liste déroulante des départements
* correspondant à la région sélectionnée.
*/
/* Paramètres de connexion */
$serveur = "localhost";
$admin = "*****";
$mdp = "*****";
$base = "*****";

/* On récupère l'identifiant de la région choisie. */
$idr = isset($_GET['idr']) ? $_GET['idr'] : false;
/* Si on a une région, on procède à la requête */
if(false !== $idr)
{
/* Cération de la requête pour avoir les départements de cette région */
$sql2 = "SELECT `id_departement`, `departement`".
" FROM `departement`".
" WHERE `id_region` = ". $idr ."".
" ORDER BY `id_departement`;";
$connexion = mysql_connect($serveur, $admin, $mdp);
mysql_select_db($base, $connexion);
$rech_dept = mysql_query($sql2, $connexion);
/* Un petit compteur pour les départements */
$nd = 0;
/* On crée deux tableaux pour les numéros et les noms des départements */
$code_dept = array();
$nom_dept = array();
/* On va mettre les numéros et noms des départements dans les deux tableaux */
while(false != ($ligne_dept = mysql_fetch_assoc($rech_dept)))
{
$code_dept[] = $ligne_dept['id_departement'];
$nom_dept[] = $ligne_dept['departement'];
$nd++;
}
/* Maintenant on peut construire la liste déroulante */
$liste = "";
$liste .= '<select name="Zdepartement" id="departement">'."\n";
for($d = 0; $d < $nd; $d++)
{
$liste .= ' <option value="'. $code_dept[$d] .'">'. htmlentities($nom_dept[$d]) .'</option>'."\n";
}
$liste .= '</select>'."\n";
/* Un petit coup de balai */
mysql_free_result($rech_dept);
/* Affichage de la liste déroulante */
echo($liste);
}
/* Sinon on retourne un message d'erreur */
else
{
echo("<p>Une erreur s'est produite. La région sélectionnée comporte une donnée invalide.</p>\n" );
}
?>

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 requête du genre :

$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

Posté

C'est clairement une meilleure idée de continuer à stocker les ids et faire des jointures lors des requêtes (pour l'affichage). Ca permet de stocker moins de données en base (elle est donc plus petite et plus rapide d'accès), de répercuter des modifications facilement, d'assurer la cohérence des données, etc.

Jacques.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...