Page 1 sur 1

Problème de liste déroulante dynamique

Posté : 15 août 2005, 14:38
par pingoo
Bonjour,
Voila mon problème, j'utilise deux listes déroulantes dynamiques alimentés par une base mysql.
Tout marche sans problème seulement quand je récupère les données sur une autre page elles sont inutilisables.
Comme j'assoicie une marque et ces modèles, le numéro de la marque et le bon par contre les modèle on tous le même numéro donc pour les différencier il faudrait que j'utilise un numéro auto-incrémenté que j'ai ajouté dans la base de donnée mais que je n'arrive pas à intégrer dans mon script.
Je sais pas si je suis assé clair.
Voici mon code (qui est celui du FAQ):
<?php
					   /* On récupère si elle existe la valeur de la région envoyée par le formulaire */ 
					   $idr = isset($_POST['marques'])?$_POST['marques']:null; 
					   // Paramètres de la Connexion à la base MYSQL
					   include("connexauto.php");
					   /* On établit la connexion à MySQL avec mysql_pconnect() plutôt qu'avec mysql_connect()
					   *  car on aura besoin de la connexion un peu plus loin dans le script */
					   $connexion = mysql_pconnect($serveur, $admin, $mdp);
					   if($connexion != false)
					   {
    				   $choixbase = mysql_select_db($base, $connexion);
    				   $sql1 = "SELECT `id_cat`, `marques`".
    				   " FROM `marque_auto`".
    				   " ORDER BY `id_cat`";
    				   $rech_regions = mysql_query($sql1);
    				   $code_region = array();
    				   $region = array();
    				   /* On active un compteur pour les régions */
    				   $nb_regions = 0;
    				   if($rech_regions != false)
    				   {
        			   while($ligne = mysql_fetch_assoc($rech_regions))
        			   {
           			   array_push($code_region, $ligne['id_cat']);
            		   array_push($region, $ligne['marques']);

            		   /* On incrémente de compteur */
            		   $nb_regions++;
        			   }
                       }
                  	   ?>
					   <select name="marques" id="marque_auto" onchange="document.forms['chgdept'].submit();">
 					   <option value="-1">Choisissez une marque</option>
    				   <?php
    				   for($i = 0; $i < $nb_regions; $i++)
    				   {
					   ?>
  					   <option value="<?php echo($code_region[$i]); ?>"<?php echo((isset($idr) && $idr == $code_region[$i])?" selected=\"selected\"":null); ?>><?php echo($region[$i]); ?></option>
					   <?php
    				   }
    				   ?>
					   </select><br>
					   </td>
				   </tr>
				   <tr>
					   <td align="right" height="35"><b>* Modèle :</b><br></td>
				   	   <td>&nbsp;&nbsp; 
    				   <?php
    				   mysql_free_result($rech_regions);
    				   /* On commence par vérifier si on a envoyé un numéro de région et le cas échéant s'il est différent de -1 */

    				   if(isset($idr) && $idr != -1)
    				   {
        			   /* Cération de la requête pour avoir les départements de cette région */
        			   $sql2 = "SELECT `idcat`, `types`, 'id_scat'".
        			   " FROM `type_auto`".
        			   " WHERE `idcat` = ". $idr ."".
        			   " ORDER BY `id_scat`;";
        			   if($connexion != false)
        			   {
            		   $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();
					   $n_dept = array();
            		   /* On va mettre les numéros et noms des départements dans les deux tableaux */
           			   while($ligne_dept = mysql_fetch_assoc($rech_dept))
            		   {
               		   array_push($code_dept, $ligne_dept['idcat']);
                	   array_push($nom_dept, $ligne_dept['types']);
                	   $nd++;
            		   }
            		   /* Maintenant on peut construire la liste déroulante */
            		   ?>
					   <select name="modele" id="type_auto">
            		   <?php
            		   for($d = 0; $d<$nd; $d++)
            		   {
                	   ?>
  					   <option value="<?php echo($code_dept[$d]); ?>"<?php echo((isset($dept_selectionne) && $dept_selectionne == $code_dept[$d])?" selected=\"selected\"":null); ?>><?php echo($nom_dept[$d]." "); ?></option>
                	   <?php
            		   }
					   ?>
					   </select> 
					   <?php
        			   }
        			   /* Un petit coup de balai */
        			   mysql_free_result($rech_dept);
    				   }
					   ?>
					   </form>
					   <?php
    				   /* Terminé, on ferme la connexion */
    				   mysql_close($connexion);
					   }
					   else
					   {
    				   /* Si on arrive là, c'est pas bon signe, il faut vérifier les
    				   * paramètres de connexion, mot de passe, serveur pas démarré etc... */
					   ?>
					   <p>Un incident s'est produit lors de la connexion à la base de données, veuiillez essayer à nouveau ultérieurement.</p>
					   <?php
					   }
					   ?>
<input type="hidden" name="marques" value="<?php echo (isset($_POST['marques'])) ? $_POST['marques'] : null; ?>"> 
				 <input type="hidden" name="modele" value="<?php echo (isset($_POST['modele'])) ? $_POST['modele'] : null; ?>">
Merci pour votre aide

Posté : 15 août 2005, 14:42
par Cyrano
Le problème vient peut-être bien de l'architecture de ta base de données. Ton script dans ce cas n'est pas en cause, le défaut de conception est en amont.

Posté : 15 août 2005, 14:48
par pingoo
Le script n'est pas du tout en cause mais je n'arrive pas à l'adapter à ma base de données.
Ma base est conçu très simplement j'ai créer deux table :
Dans la première ce trouve les marques associé à un numéro.
Dans la deuxième sont répertorié les Modèles avec un numéro qui et égal à celui de la marque correspondante. Donc le problème c'est qu'il y à plusieur modèle avec le même numéro. Comment les différencier?

Posté : 15 août 2005, 14:50
par Cyrano
fais voir la structure de tes tables.

Note : sujet déplacé vers "Base de données"

Posté : 15 août 2005, 14:55
par pingoo
comment?
:oops:

Posté : 15 août 2005, 15:03
par Cyrano
ouvre phpMyAdmin, sélectionne ta base, clique ensuite sur [Exporter] et décoche la case "Données" dans le formulaire. Ensuite clique sur "Transmettre" : ça va ouvrir le script de création de la base dans un fichier .sql (dans le bloc-note probablement) : copie la structure de création des deux tables et colle ça ici entre deux balises [code][/code]

Posté : 15 août 2005, 15:08
par pingoo
Ok voila :

Code : Tout sélectionner

# # Structure de la table `marque_auto` # CREATE TABLE `marque_auto` ( `id_cat` int(5) NOT NULL auto_increment, `marques` varchar(50) NOT NULL default '', `vehicule` varchar(255) NOT NULL default '', PRIMARY KEY (`id_cat`), UNIQUE KEY `marques` (`marques`) ) TYPE=MyISAM AUTO_INCREMENT=501 ; # -------------------------------------------------------- # # Structure de la table `type_auto` # CREATE TABLE `type_auto` ( `id_scat` int(5) NOT NULL auto_increment, `idcat` int(5) NOT NULL default '0', `types` varchar(50) NOT NULL default '', `comment` varchar(255) NOT NULL default '', PRIMARY KEY (`id_scat`), UNIQUE KEY `types` (`types`) ) TYPE=MyISAM AUTO_INCREMENT=768 ;

Posté : 15 août 2005, 15:31
par Cyrano
Comment fais-tu ta jointure pour récupérer les véhicules de chaque marque ?

Posté : 15 août 2005, 15:37
par pingoo
Pour marque_auto j'ai donnée un numéro à chaque marque(id_cat), et pour type_auto j'ai fait de même dans idcat.
Style : Marques 2 Audi - 3 BMW - ...
Types 2 A3 - 2 A4 - ... et 3 M3 - 3 coupé - ...
Dans le script j'ais simplement modifié :

Code : Tout sélectionner

WHERE `idcat` = ". $idr ."

Posté : 15 août 2005, 15:41
par Cyrano
C'est toute la requête qu'il faudrait mettre... :-k

Posté : 15 août 2005, 15:44
par pingoo
Requête pour les marques :

Code : Tout sélectionner

$sql1 = "SELECT `id_cat`, `marques`". " FROM `marque_auto`". " ORDER BY `id_cat`";
Requête pour le type :

Code : Tout sélectionner

$sql2 = "SELECT `idcat`, `types`, 'id_scat'". " FROM `type_auto`". " WHERE `idcat` = ". $idr ."". " ORDER BY `id_scat`;";

Posté : 15 août 2005, 15:57
par Cyrano
En regardant le code d'un peu près, je réalise que tu t'es pas foulé, tu aurais au moins pu personnaliser le code au lieu de laisser région et dept... enfin bon. Ceci dit, c'est normal que tu récuperes toujours le même numéro pour les types puisque tu ne mets pas le bon champ dans la variable $code_dept.

Proposition de correction avec renommage global:
<?php
/* On récupère si elle existe la valeur de la région envoyée par le formulaire */
$idr = isset($_POST['marques'])?$_POST['marques']:null;
// Paramètres de la Connexion à la base MYSQL
include("connexauto.php");
/* On établit la connexion à MySQL avec mysql_pconnect() plutôt qu'avec mysql_connect()
* car on aura besoin de la connexion un peu plus loin dans le script */
$connexion = mysql_pconnect($serveur, $admin, $mdp);
if($connexion != false)
{
    $choixbase = mysql_select_db($base, $connexion);
    $sql1 = "SELECT `id_cat`, `marques`".
    " FROM `marque_auto`".
    " ORDER BY `id_cat`";
    $rech_marques = mysql_query($sql1);
    $code_marque = array();
    $marque = array();
    /* On active un compteur pour les régions */
    $nb_marques = 0;
    if($rech_marques != false)
    {
        while($ligne = mysql_fetch_assoc($rech_marques))
        {
            array_push($code_marque, $ligne['id_cat']);
            array_push($marque, $ligne['marques']);
            /* On incrémente de compteur */
            $nb_marques++;
        }
    }
    ?>
  <select name="marques" id="marque_auto" onchange="document.forms['chgtype'].submit();">
  <option value="-1">Choisissez une marque</option>
<?php
    for($i = 0; $i < $nb_marques; $i++)
    {
        ?>
  <option value="<?php echo($code_marque[$i]); ?>"<?php echo((isset($idr) && $idr == $code_marque[$i])?" selected=\"selected\"":null); ?>><?php echo($marque[$i]); ?></option>
<?php
    }
    ?>
  </select><br>
</td>
</tr>
<tr>
  <td align="right" height="35"><b>* Modèle :</b><br></td>
  <td>&nbsp;&nbsp;
<?php
    mysql_free_result($rech_marques);
    /* On commence par vérifier si on a envoyé un numéro de région et le cas échéant s'il est différent de -1 */
    if(isset($idr) && $idr != -1)
    {
        /* Cération de la requête pour avoir les départements de cette région */
        $sql2 = "SELECT `idcat`, `types`, 'id_scat'".
        " FROM `type_auto`".
        " WHERE `idcat` = ". $idr ."".
        " ORDER BY `id_scat`;";
        if($connexion != false)
        {
            $rech_type = 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_type = array();
            $nom_type = array();
            $n_type = array();
            /* On va mettre les numéros et noms des départements dans les deux tableaux */
            while($ligne_type = mysql_fetch_assoc($rech_type))
            {
                array_push($code_type, $ligne_type['id_scat']);
                array_push($nom_type, $ligne_type['types']);
                $nd++;
            }
            /* Maintenant on peut construire la liste déroulante */
            ?>
    <select name="modele" id="type_auto">
<?php
            for($d = 0; $d<$nd; $d++)
            {
?>
    <option value="<?php echo($code_type[$d]); ?>"<?php echo((isset($type_selectionne) && $type_selectionne == $code_type[$d])?" selected=\"selected\"":null); ?>><?php echo($nom_type[$d]." "); ?></option>
<?php
            }
?>
    </select>
<?php
        }
        /* Un petit coup de balai */
        mysql_free_result($rech_type);
    }
    ?>
  </form>
<?php
    /* Terminé, on ferme la connexion */
    mysql_close($connexion);
}
else
{
    /* Si on arrive là, c'est pas bon signe, il faut vérifier les
    * paramètres de connexion, mot de passe, serveur pas démarré etc... */
?>
  <p>Un incident s'est produit lors de la connexion à la base de données, veuiillez essayer à nouveau ultérieurement.</p>
<?php
}
?>
  <input type="hidden" name="marques" value="<?php echo (isset($_POST['marques'])) ? $_POST['marques'] : null; ?>">
  <input type="hidden" name="modele" value="<?php echo (isset($_POST['modele'])) ? $_POST['modele'] : null; ?>">

Posté : 15 août 2005, 16:14
par pingoo
Ok je vais faire un peu de nettoyage et mieux adapter mon script comme tu l'as fait puis modifier la variable...

Posté : 15 août 2005, 23:34
par pingoo
Cela ne fonctionne pas j'ai cherché toute l'aprem sans résultat .
La marques est bien envoyé mais le type est "id_scat".
J'ai essayé avec votre Proposition de correction mais cala me donne aussi "id_scat".

Posté : 17 août 2005, 13:08
par Invité
J'ai trouvé pourquoi cela ne fonctionnais pas.
La valeur et placé dans la variable aprés validation donc comme ma validation était indirect au deux listes elle ne pouvait être prise en compte.
J'ai donc ajouter un "onchange" à la deuxième listes ce qui à validé la valeur.
Merci pour votre aide et à bientôt :P