Problème de liste déroulante dynamique

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème de liste déroulante dynamique

par Invité » 17 août 2005, 13:08

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

par pingoo » 15 août 2005, 23:34

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".

par pingoo » 15 août 2005, 16:14

Ok je vais faire un peu de nettoyage et mieux adapter mon script comme tu l'as fait puis modifier la variable...

par Cyrano » 15 août 2005, 15:57

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; ?>">

par pingoo » 15 août 2005, 15:44

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`;";

par Cyrano » 15 août 2005, 15:41

C'est toute la requête qu'il faudrait mettre... :-k

par pingoo » 15 août 2005, 15:37

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 ."

par Cyrano » 15 août 2005, 15:31

Comment fais-tu ta jointure pour récupérer les véhicules de chaque marque ?

par pingoo » 15 août 2005, 15:08

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 ;

par Cyrano » 15 août 2005, 15:03

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]

par pingoo » 15 août 2005, 14:55

comment?
:oops:

par Cyrano » 15 août 2005, 14:50

fais voir la structure de tes tables.

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

par pingoo » 15 août 2005, 14:48

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?

par Cyrano » 15 août 2005, 14:42

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.

Problème de liste déroulante dynamique

par pingoo » 15 août 2005, 14:38

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