Problème avec des listes déroulantes dynamiques liées.

Eléphant du PHP | 258 Messages

17 mars 2010, 14:58

Je vous laisse le choix de tester mes fichiers ci-dessous
merci beaucoup
<?php echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?".">"; ?>

index.php

<?php

$serveur = "localhost";

$admin   = "root";

$mdp     = "";

$base    = "geographie";

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />

<link href="styles.css" rel="stylesheet" type="text/css" />

<script type="text/javascript" src="mod_xhr.js" charset="iso_8859-1"></script>

<script type="text/javascript" src="typ_xhr.js" charset="iso_8859-1"></script>

<?php

/* Requête SQL de récupération des données de la première liste */

$sql = "SELECT `id_region` AS idm, `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 */

    $marques = array();

    /* Index du modèle par tableau de marque */

    $id = 0;

    while($ligne = mysql_fetch_assoc($recherche))

    {

        $marques[$ligne['idm']] = $ligne['region'];

    }

?>

</head>

<body>

<div id="globalselect"><br />

<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgmod">



<br />

1. <select name="marque" id="marque" style="width:420px; background-color:#E3E3E3; border:solid 1px; border-color:#CCCCCC;" onchange="getModeles(this.value);">

      <option value="vide">- - - - - - - - - - - - - - - - - Choisissez une marque - - - - - - - - - - - - - - - - - -</option>

    <?php

    /* Construction de la première liste : on se sert du tableau PHP */

    foreach($marques as $nm => $nom)

    {

    ?>

    <option value="<?php echo($nm); ?>"><?php echo($nom); ?></option>

        <?php

    }

    ?>

    </select>

<br />

<br />    <!-- ICI, le secret : on met un bloc avec un id ou va s'insérer le code de

         la seconde liste déroulande -->

2. <span id="blocModeles"><select name="modele" disabled id="modele" style="width:420px; background-color:#E3E3E3; border:solid 1px; border-color:#CCCCCC;" onchange="getTypes(this.value);">

      <option value="vide">- - - - - - - - - - - - - - - - - Choisissez un modèle - - - - - - - - - - - - - - - - - - -</option>

    </select></span><br />

<br />

3. <span id="blocTypes"><select name="type" disabled id="type" style="width:420px; background-color:#E3E3E3; border:solid 1px; border-color:#CCCCCC;" onchange="getProduits(this.value);">

      <option value="vide">- - - - - - - - - - - - - - - - - Choisissez un type - - - - - - - - - - - - - - - - - - - - - -</option>

    </select></span>

<br /><br />

<br />  <center><input type="submit" name="ok" id="ok" value="Envoyer" /></center>

</form>

</div>

<?php

}

else

{

    /*  Si vous arrivez ici, vous avez un gros problème avec la connexion au serveur de base de données */

?>

<p>La connexion au serveur de base de données a échoué. Aucun élément ne peut être affiché.</p>

<?php

}

?>

</body>

</html>
modeles.php
<?php
print_r($_GET);
/**
 * Code qui sera appelé par un objet XHR et qui
 * retournera la liste déroulante des modèles
 * correspondant à la marque sélectionnée.
 */
/* Paramètres de connexion */
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "geographie";

/* On récupère l'identifiant de la marque choisie. */
$idm = isset($_GET['idm']) ? $_GET['idm'] : false;
/* Si on a une marque, on procède à la requête */
if(false !== $idm)
{
    /* Création de la requête pour avoir les modèles de cette marque */
    $sql2 = "SELECT `id_departement` AS idmd, `nom_departement`".
            " FROM `departement`".
            " WHERE `id_region` = ". $idm ."".
            " ORDER BY `id_departement` ASC;";
    $connexion = mysql_connect($serveur, $admin, $mdp);
    mysql_select_db($base, $connexion);
    $query = mysql_query($sql2, $connexion);
    /* Un petit compteur pour les modèles */
    $initial = 0;
    /* On crée deux tableaux pour les numéros et les noms des modèles */
    $modeles = array();
    /* On va mettre les numéros et noms des modèles dans les deux tableaux */
  /*
    while(false != ($row = mysql_fetch_assoc($query)))
    {
          //$modeles[$ligne['idm']] = $ligne['region'];
        //$modeles[]  = $row['id_departement'];
        $modeles[]  = $row['nom_departement'];
       $initial++;
    }
   */
     while($ligne = mysql_fetch_assoc($query))

    {

        $modeles[$ligne['idmd']] = $ligne['nom_departement'];

    }
?>
   <select name="marque" id="marque" style="width:420px; background-color:#E3E3E3; border:solid 1px; border-color:#CCCCCC;" onchange="getTypes(this.value);">

      <option value="vide">- - - - - - - - - - - - - - - - - Choisissez une type - - - - - - - - - - - - - - - - - -</option>

    <?php

    /* Construction de la première liste : on se sert du tableau PHP */

    foreach($modeles as $initial => $nom_modeles)

    {

    ?>

    <option value="<?php echo($initial); ?>"><?php echo($nom_modeles); ?></option>

        <?php

    }

    ?>

    </select>
<?php
}
/* Sinon on retourne un message d'erreur */
else
{
    echo("<p>Une erreur s'est produite. Le modele selectionne comporte une donnee invalide.</p>\n");
}
?>
types.php
<?php
 print_r($_GET);
/**
 * Code qui sera appelé par un objet XHR et qui
 * retournera la liste déroulante des modèles
 * correspondant à la type sélectionnée.
 */
/* Paramètres de connexion */
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "geographie";

/* On récupère l'identifiant de la type choisie. */
$idmd = isset($_GET['idmd']) ? $_GET['idmd'] : false;
/* Si on a une type, on procède à la requête */
if(false !== $idmd)
{
    /* Création de la requête pour avoir les modèles de cette type */
    $sql3 = "SELECT `id_ville` as idv, `nom_ville` FROM `ville`WHERE `id_departement` = '. $idmd .'";
    $connexion = mysql_connect($serveur, $admin, $mdp);
    mysql_select_db($base, $connexion);
    $query = mysql_query($sql3, $connexion);
    /* Un petit compteur pour les modèles */
    $initial = 0;
    /* On crée deux tableaux pour les numéros et les noms des modèles */
    $types = array();
    /* On va mettre les numéros et noms des modèles dans les deux tableaux */
  /*
    while(false != ($row = mysql_fetch_assoc($query)))
    {
          //$types[$ligne['idmd']] = $ligne['region'];
        //$types[]  = $row['id_departement'];
        $types[]  = $row['nom_departement'];
       $initial++;
    }
   */
     while($ligne = mysql_fetch_assoc($query))

    {

        $types[$ligne['idv']] = $ligne['nom_ville'];

    }
?>
   <select name="type" id="type" style="width:420px; background-color:#E3E3E3; border:solid 1px; border-color:#CCCCCC;">

      <option value="vide">- - - - - - - - - - - - - - - - - Choisissez une type - - - - - - - - - - - - - - - - - -</option>

    <?php

    /* Construction de la première liste : on se sert du tableau PHP */

    foreach($types as $initial => $nom_types)

    {

    ?>

    <option value="<?php echo($initial); ?>"><?php echo($nom_types); ?></option>

        <?php

    }

    ?>

    </select>
<?php
}
/* Sinon on retourne un message d'erreur */
else
{
    echo("<p>Une erreur s'est produite. Le modele selectionne comporte une donnee invalide.</p>\n");
}
ob_end_flush();
?>
mod_xhr.js
/**
* Lister les modèles d'une marque avec un objet
* XMLHTTPRequest.
*/
/* Création de la variable globale qui contiendra l'objet XHR */
var requete = null;
/**
* Fonction privée qui va créer un objet XHR.
* Cette fonction initialisera la valeur dans la variable globale définie
* ci-dessus.
*/
function creerRequete()
{
    try
    {
        /* On tente de créer un objet XmlHTTPRequest */
        requete = new XMLHttpRequest();
    }
    catch (microsoft)
    {
        /* Microsoft utilisant une autre technique, on essays de créer un objet ActiveX */
        try
        {
            requete = new ActiveXObject('Msxml2.XMLHTTP');
        }
        catch(autremicrosoft)
        {
            /* La première méthode a échoué, on en teste une seconde */
            try
            {
                requete = new ActiveXObject('Microsoft.XMLHTTP');
            }
            catch(echec)
            {
                /* À ce stade, aucune méthode ne fonctionne... mettez donc votre navigateur à jour ;) */
                requete = null;
            }
        }
    }
    if(requete == null)
    {
        alert('Impossible de créer l\'objet requête,\nVotre navigateur ne semble pas supporter les object XMLHttpRequest.');
    }
}
/**
* Fonction privée qui va mettre à jour l'affichage de la page.
*/
function actualiserModeles()
{
    var listeMod = requete.responseText;
    var blocListe = document.getElementById('blocModeles');
    blocListe.innerHTML = listeMod;
}

/**
* Fonction publique appelée par la page affichée.
* Cette fonction va initialiser la création de l'objet XHR puis appeler
* le code serveur afin de récupérer les données à modifier dans la page.
*/
function getModeles(idm)
{
    /* Si il n'y a pas d'identifiant de marque, on fait disparaître la seconde liste au cas où elle serait affichée */
    if(idm == 'vide')
    {
        document.getElementById('blocModeles').innerHTML = '';
    }
    else
    {
        /* À cet endroit précis, on peut faire apparaître un message d'attente */
        var blocListe = document.getElementById('blocModeles');
        blocListe.innerHTML = "Traitement en cours, veuillez patienter...";
        /* On crée l'objet XHR */
        creerRequete();
        /* Définition du fichier de traitement */
        var url = 'modeles.php?idm='+ idm;
        /* Envoi de la requête à la page de traitement */
        requete.open('GET', url, true);
        /* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */
        requete.onreadystatechange = function()
        {
            /* Lorsque l'état est à 4 */
            if(requete.readyState == 4)
            {
                /* Si on a un statut à 200 */
                if(requete.status == 200)
                {
                    /* Mise à jour de l'affichage, on appelle la fonction apropriée */
                    actualiserModeles();
                }
            }
        };
        requete.send(null);
    }
}
typ_xhr.js
//**
* Lister les modèles d'une marque avec un objet
* XMLHTTPRequest.
*/
/* Création de la variable globale qui contiendra l'objet XHR */
var requete = null;
/**
* Fonction privée qui va créer un objet XHR.
* Cette fonction initialisera la valeur dans la variable globale définie
* ci-dessus.
*/
function creerRequete()
{
    try
    {
        /* On tente de créer un objet XmlHTTPRequest */
        requete = new XMLHttpRequest();
    }
    catch (microsoft)
    {
        /* Microsoft utilisant une autre technique, on essays de créer un objet ActiveX */
        try
        {
            requete = new ActiveXObject('Msxml2.XMLHTTP');
        }
        catch(autremicrosoft)
        {
            /* La première méthode a échoué, on en teste une seconde */
            try
            {
                requete = new ActiveXObject('Microsoft.XMLHTTP');
            }
            catch(echec)
            {
                /* À ce stade, aucune méthode ne fonctionne... mettez donc votre navigateur à jour ;) */
                requete = null;
            }
        }
    }
    if(requete == null)
    {
        alert('Impossible de créer l\'objet requête,\nVotre navigateur ne semble pas supporter les object XMLHttpRequest.');
    }
}

/**
* Fonction privée qui va mettre à jour l'affichage de la page.
*/
function actualiserTypes()
{
    var listeTyp = requete.responseText;
    var blocListe = document.getElementById('blocTypes');
    blocListe.innerHTML = listeTyp;
}

/**
* Fonction publique appelée par la page affichée.
* Cette fonction va initialiser la création de l'objet XHR puis appeler
* le code serveur afin de récupérer les données à modifier dans la page.
*/
function getTypes(idmd)
{
    /* Si il n'y a pas d'identifiant de modele, on fait disparaître la seconde liste au cas où elle serait affichée */
    if(idmd == 'vide')
    {
        document.getElementById('blocTypes').innerHTML = '';
    }
    else
    {
        /* À cet endroit précis, on peut faire apparaître un message d'attente */
        var blocListe = document.getElementById('blocTypes');
        blocListe.innerHTML = "Traitement en cours, veuillez patienter...";
        /* On crée l'objet XHR */
        creerRequete();
        /* Définition du fichier de traitement */
        var url = 'types.php?idmd='+ idmd;
        /* Envoi de la requête à la page de traitement */
        requete.open('GET', url, true);
        /* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */
        requete.onreadystatechange = function()
        {
            /* Lorsque l'état est à 4 */
            if(requete.readyState == 4)
            {
                /* Si on a un statut à 200 */
                if(requete.status == 200)
                {
                    /* Mise à jour de l'affichage, on appelle la fonction apropriée */
                    actualiserTypes();
                }
            }
        };
        requete.send(null);
    }
}
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 mars 2010, 19:01

code de types.php
<?php
 print_r($_GET);
/**
 * Code qui sera appelé par un objet XHR et qui
 * retournera la liste déroulante des modèles
 * correspondant à la type sélectionnée.
 */
/* Paramètres de connexion */
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "geographie";

/* On récupère l'identifiant de la type choisie. */
$idmd = isset($_GET['idmd']) ? $_GET['idmd'] : false;
/* Si on a une type, on procède à la requête */
if(false !== $idmd)
{
    /* Création de la requête pour avoir les modèles de cette type */
    $sql3 = "SELECT `id_ville` as idv, `nom_ville` FROM `ville`WHERE `id_departement` = '. $idmd .'";
    echo("sql3 = ".$sql3);
    $connexion = mysql_connect($serveur, $admin, $mdp);
    mysql_select_db($base, $connexion);
    $query = mysql_query($sql3, $connexion);
    /* Un petit compteur pour les modèles */
    $initial = 0;
    /* On crée deux tableaux pour les numéros et les noms des modèles */
    $types = array();
    /* On va mettre les numéros et noms des modèles dans les deux tableaux */
  /*
    while(false != ($row = mysql_fetch_assoc($query)))
    {
          //$types[$ligne['idmd']] = $ligne['region'];
        //$types[]  = $row['id_departement'];
        $types[]  = $row['nom_departement'];
       $initial++;
    }
   */
     while($ligne = mysql_fetch_assoc($query))

    {

        $types[$ligne['idv']] = $ligne['nom_ville'];

    }    
     print_r($types); 
}
/* Sinon on retourne un message d'erreur */
else
{
    echo("<p>Une erreur s'est produite. Le modele selectionne comporte une donnee invalide.</p>\n");
}
ob_end_flush();
?>
But:
- afficher le contenu de GET
- afficher la requête
- afficher le tableau resultant

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 258 Messages

18 mars 2010, 10:37

non ca passe pas.
Array ( [idmd] => 67 )
sql3 = SELECT `id_ville` as idv, `nom_ville` FROM `ville`WHERE `id_departement` = '. 67 .'
Array ( )
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 mars 2010, 10:42

Bien sûr que ça ne passe pas l'objectif n'était pas de remplir ta liste mais de "débugger"

Eh bien voilà je dirai qu'il y a un souci la:
sql3 = SELECT `id_ville` as idv, `nom_ville` FROM `ville`WHERE `id_departement` = '. 67 .'

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 258 Messages

18 mars 2010, 10:52

ah bon??
dans cette requête, il y a un problème? en enlevant les points?
sql3 = SELECT `id_ville` as idv, `nom_ville` FROM `ville`WHERE `id_departement` = '. 67 .'
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Eléphant du PHP | 258 Messages

18 mars 2010, 11:14

c'est bon !! j'ai trouvé

ce sont des points qui empechent !!

Une fois corrigé, je mettrai (dans quelques heures) pour vous un zip contenant des fichiers et un sql.
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 mars 2010, 15:00

c'est bon !! j'ai trouvé
Bravo =D>
Il y avait donc bien une solution ;)

Lorsque rien ne marche et tu ne sais plus quoi faire il faut ajouter les traces (= afficher le contenu des variables, des messages su style "je passe le test toto", requêtes...) et tu analyses le retour

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 258 Messages

19 mars 2010, 16:10

Bonjour

merci à tous d'avoir résolu le problème.

Ci-joint pour ceux qui ont envie d'utiliser le script zippé (toutefois, il y a de l'amélioration à faire)

aie, impossible de joindre le fichier zippé?
Impossible de transférer le fichier joint de ./files/1861_bab56c7089f146a885b9dde52a8b409e
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 mars 2010, 16:51

Un copier coller du code peut faire l'affaire... au pire la soluce est déjà posté (sans les points de concaténation dans la requête)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 258 Messages

19 mars 2010, 16:54

ce serait trop long!!!
un upload me ferait gagner du temps. merci sinon à mettre résolu

bon week end
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver