IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Listes Liées Firefox


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur du Dimanche
    Inscrit en
    Juillet 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur du Dimanche
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 147
    Par défaut Listes Liées Firefox
    Bonjour,
    J'ai ce lien avec un filtre par critère (sous le champ recherche d'Artistes), il fonctionne mais que sur GoogleChrome.
    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
       <meta http-equiv="Cache-Control" content="no-cache">
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
       <title>Listes liées</title>
     
       <script type="application/javascript" charset="utf-8" src="http://code.jquery.com/jquery-1.6.3.min.js"></script>
       <script type="application/javascript">
          function filterLists() {
             // ici on récupère les valeurs sélectionnées pour chaque liste avec les sélecteurs de jQuery
             var age    = $('#ages option:selected').val();
             var sexe   = $('#sexes option:selected').val();
             var metier = $('#metiers option:selected').val();
    		 var metier1 = $('#metiers1 option:selected').val();
             // on fait notre appel ajax paramétré (pas besoin de s'occuper de l'implémentation du XMLHttpRequest, jQuery le fait pour toi)
             $.ajax({
                type: 'POST',   // méthode de transmission des données
                url: 'filterLists.php',   // script à exécuter sur le serveur
                data: 'age_='+age+'&sexe='+sexe+'&metier='+metier+'&metier1='+metier1,   // données à passer au script via le tableau $_POST
                dataType: 'xml',   // type des données attendues en retour : ici xml
                cache: false,
                success: function(response) {   // traitement du résultat (= données reçues du serveur) une fois l'appel ajax réussi
                   var code;
                   // vu que la réponse est au format xml, on demande à jquery de trouver des noeuds spécifiques
                   // et si ces noeuds contiennent des données alors on remplace les données des listes liées par celles renvoyées par le serveur
                   // en clair : on remplace si nécessaire l'ensemble des lignes <option value=""></option> pour chaque liste qui n'a pas encore de sélection
                   if ((code = $(response).find('ages').text()).length)    $('#ages').html(code);
                   if ((code = $(response).find('sexes').text()).length)   $('#sexes').html(code);
                   if ((code = $(response).find('metiers').text()).length) $('#metiers').html(code);
    			    if ((code = $(response).find('metiers1').text()).length) $('#metiers1').html(code);
                   if ((code = $(response).find('table').text()).length)    $('#table').html(code);
                }
             });
          }
       </script>
       <style type="text/css">
          body { font-family: "arial"; background-color:#000; color:#fff; }
          table { width: 600px;}
          table, tr, th, td { border: 1px solid black; border-collapse: collapse; padding: 4px;}
          .alignr { text-align: right; }
          .alignc { text-align: center; }
     
    	  #flip {
        font-size:12px;
        padding: 0px;
    	float:left;
        background-color: #000;
     
    }
     
    #panel {
     
    	width: 600px;
        padding-top: 20px;
        display: none;
    }
     
       </style>
     
      <script>
    $(document).ready(function(){
        $("#flip").click(function(){
            $("#panel").slideToggle("slow");
        });
    });
    </script>
     
    </head>
    <body>
       <?php
     
          // ICI MODIFIEZ LE PARAMETRAGE
          // Connexion à la base de données
          $server = 'test.mysql.db';
          $user   = 'test';
          $pwd    = 'mdp';
          $dbName = 'test';
          $cnx    = mysql_connect($server, $user, $pwd);
          $db     = mysql_select_db($dbName);
     
          // Au démarrage, aucune sélection : on extrait toutes les données individuellement pour chaque liste
     
          // ages
          $sql = 'SELECT DISTINCT t_age.idAge, t_age.age_ FROM t_age ORDER BY t_age.age_;';
          $qry = mysql_query($sql);
          while($row = mysql_fetch_row($qry)) {
             $ages[$row[0]] = $row[1];
          }
     
          // VILLES
          $sql = 'SELECT DISTINCT t_sexe.idSexe, t_sexe.sexe FROM t_sexe ORDER BY t_sexe.sexe;';
          $qry = mysql_query($sql);
          while($row = mysql_fetch_row($qry)) {
             $sexes[$row[0]] = $row[1];
          }
     
          // METIERS
          $sql = 'SELECT DISTINCT t_metier.idMetier, t_metier.metier FROM t_metier ORDER BY t_metier.metier;';
          $qry = mysql_query($sql);
          while($row = mysql_fetch_row($qry)) {
             $metiers[$row[0]] = $row[1];
          }
           // STARS
          $sql = 'SELECT DISTINCT t_stars.idStar, t_stars.nom_star FROM t_stars ORDER BY t_stars.nom_star;';
          $qry = mysql_query($sql);
          while($row = mysql_fetch_row($qry)) {//Retourne une ligne de résultat MySQL sous la forme d'un tableau
             $metiers1[$row[0]] = $row[1];
          }
          // DONNES DE LA TABLE
          $sql = <<<SQL
    SELECT t_sexe.sexe, t_age.age_, t_metier.metier, t_stars.nom_star, t_age_metier.nbApparition, t_age_metier.bio, t_age_metier.image
    FROM t_age_metier
    INNER JOIN t_metier ON t_age_metier.idMetier = t_metier.idMetier
    INNER JOIN t_age ON t_age_metier.idAge = t_age.idAge
    INNER JOIN t_sexe ON t_age.idSexe = t_sexe.idSexe
    INNER JOIN t_stars ON t_age_metier.idStar = t_stars.idStar
    ORDER BY
    t_sexe.sexe ASC,
    t_age.age_ DESC,
    t_metier.metier ASC,
    t_stars.nom_star ASC;
    SQL;
          $qry = mysql_query($sql) or exit(mysql_error() . "<br/>$qry");
          while($row = mysql_fetch_assoc($qry)) {//Lit une ligne de résultat MySQL dans un tableau associatif
             $data[] = $row;
          }
     
          // pour chaque liste il faut prévoir leur retrait du filtre  
          // en insérant une ligne vide en début de liste : <option value=""></option>
       ?>
          <?php include("recherche.php"); ?>
      <div id="flip">
        <img src="images/option.png" alt="options" style="width:20px;height:22px;">Filtrer par crit&egrave;res
      </div>
       <div id="panel">
          <p>S&eacute;lectionnez de un &agrave; plusieurs crit&egrave;res de recherche.</p>
     
       <form id="frmRecherche">
     
          <!-- Liste des matières -->
          <label for="metiers">M&eacute;tiers</label>
          <select id="metiers" onchange="filterLists();">
             <option value=""></option>
             <?php foreach($metiers as $id => $metier): ?>
             <option value="<?php echo $id; ?>"><?php echo $metier; ?></option>
             <?php endforeach; ?>
          </select>
     
          <!-- Liste des sexes -->
          <label for="sexes">Sexe</label>
          <select id="sexes" onchange="filterLists();">
             <option value=""></option>
             <?php foreach($sexes as $id => $sexe): ?>
             <option value="<?php echo $id; ?>"><?php echo $sexe; ?></option>
             <?php endforeach; ?>
          </select>
     
           <!-- Liste des ages -->
          <label for="ages">Age</label>
          <select id="ages" onchange="filterLists();">
              <option value=""></option>
             <?php foreach($ages as $id => $age_): ?>
             <option value="<?php echo $id; ?>"><?php echo $age_; ?></option>
             <?php endforeach; ?>
          </select>
     
     
     
       </form>
     
     
       <!-- Données de la table -->
       <table>
         <tr>
                <th>BIO</th>
                <th>PHOTO</th>
             </tr>
     
          <tbody id="table">
          <?php foreach($data as $row): 
          
                        if (ISSET($_POST["metier"])) { echo $row['metier'];}
                if (ISSET($_POST["sexe"])) { echo $row['sexe'];}
                            if (ISSET($_POST["age_"])) { echo $row['age_'];}
                        if (ISSET($_POST["bio"])) {echo $row['bio'];}
                            if (ISSET($_POST["image"])) {echo"<img src='".$row['image']."' />";} 
                       // if (ISSET($_POST["nbApparition"])) {echo $row['nbApparition'];}
            
             
          endforeach; ?>
     
          </tbody>
       </table>
          </div>
    </body>
    </html>
    filterLists.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    <?php
     
    // Ce script est appelé à chaque sélection d'un élément d'une liste
     
    // suivi du critère
    $where   = array();
    $data    = array();
     
    // données sélectionnées => filtres
    $age    = NULL;
    $sexe   = NULL;
    $metier = NULL;
    $metier1 = NULL;
     
    /**
     * CE SCRIPT ANALYSE LES SELECTIONS ET RENVOIE DES DONNEES AU FORMAT XML  
     * La structure correspond à ce que jQuery attend pour mettre à age la page
     * <?xml version="1.0" encoding="utf-8"?>  
     *    <xml>  
     *    <ages></ages>  
     *    <sexes></sexes>  
     *    <metiers></metiers>  
     *    <table></table>  
     * </xml>  
     *
     * @var SimpleXMLElement
     */
    $xml = simplexml_load_string('<?xml version="1.0" encoding="utf-8"?><xml></xml>');
     
    // on parcourt le tableau $_POST et on vérifie quelles sont les listes qui ont une sélection
     
    // age
    if (isset($_POST['age_']) && (ctype_digit("{$_POST['age_']}"))) {
       $age = $_POST['age_'];
       $where[] = 't_age.idAge = ' . intval($age_);
     
    }
     
    // sexes
    if (isset($_POST['sexe']) && (ctype_digit("{$_POST['sexe']}"))) {
       $sexe = $_POST['sexe'];
       $where[] = 't_age.idSexe = ' . intval($sexe);
    }
     
    // matière
    if (isset($_POST['metier']) && (ctype_digit("{$_POST['metier']}"))) {
       $metier = $_POST['metier'];
       $where[] = 't_age_metier.idMetier = ' . intval($metier);
    }
     
     // matière
    if (isset($_POST['metier1']) && (ctype_digit("{$_POST['metier1']}"))) {
       $metier1 = $_POST['metier1'];
       $where[] = 't_age_metier.idStar = ' . intval($metier1);
    }
    ### FILTRAGE DES DONNÉES DES LISTES (SSI RIEN N'A DÉJÀ ÉTÉ SÉLECTIONNÉ)  
    $where = ( ! empty($where)) ? 'WHERE ' . implode(' AND ', $where) : NULL;
     
    // ICI MODIFIEZ LE PARAMETRAGE
    // Connexion à la base de données
    $server = 'test.mysql.db';
    $user   = 'test';
    $pwd    = 'mdp';
    $dbName = 'test';
    $cnx    = mysql_connect($server, $user, $pwd);
    $db     = mysql_select_db($dbName);
     
     
    // on définit le code SQL commun à toutes les requêtes
    // voir la chaine SQL d'extraction des données de la table (plus bas)
    $fromAndWhere = <<<SQL
    t_age_metier
    INNER JOIN t_metier ON t_age_metier.idMetier = t_metier.idMetier
    INNER JOIN t_age ON t_age_metier.idAge = t_age.idAge
    INNER JOIN t_sexe ON t_age.idSexe = t_sexe.idSexe
    INNER JOIN t_stars ON t_age_metier.idStar = t_stars.idStar
    $where
    SQL;
     
    /**
     * Crée le code HTML pour les liste relatives à l'age
     * @param mixed $sql
     * @return string
     */
    function filtrage($sql) {
       $data = array();
       $qry = mysql_query($sql);
       $data[] = '<option value=""></option>'; // ligne vide
       while($row = mysql_fetch_row($qry)) {
          $data[] = '<option value="' . $row[0] . '">' . $row[1] . '</option>';
       }
       return implode("\n", $data);
    } 
     
     
    // si aucun where -> on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php)
    //$fromDates = (NULL === $where) ? 't_session' : $fromAndWhere;
     
    // si le age n'a pas déjà été sélectionné -> filtrage de la liste
    if (NULL === $age) {
        $from = (NULL === $where) ? 't_age' : $fromAndWhere;
       $sql = "SELECT DISTINCT t_age.idAge, t_age.age_ FROM $from ORDER BY t_age.age_;";
       $xml->addChild('ages', filtrage($sql));  
       $data = array();
    }
     
    // si la sexe n'a pas déjà été sélectionnée -> filtrage de la liste
    if (NULL === $sexe) {
       // si aucun where -> on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php)
       $from = (NULL === $where) ? 't_sexe' : $fromAndWhere;
       $sql = "SELECT DISTINCT t_sexe.idSexe, t_sexe.sexe FROM $from ORDER BY t_sexe.sexe;";
       $xml->addChild('sexes', filtrage($sql));  
       $data = array();
    }
     
    // si la matière n'a pas déjà été sélectionnée -> filtrage de la liste
    if (NULL === $metier) {
       // si aucun where -> on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php)
       $from = (NULL === $where) ? 't_metier' : $fromAndWhere;
       $sql = "SELECT DISTINCT t_metier.idMetier, t_metier.metier FROM $from ORDER BY t_metier.metier;";
       $xml->addChild('metiers', filtrage($sql));
       $data = array();
    }
     // si la matière n'a pas déjà été sélectionnée -> filtrage de la liste
    if (NULL === $metier1) {
       // si aucun where -> on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php)
       $from = (NULL === $where) ? 't_stars' : $fromAndWhere;
       $sql = "SELECT DISTINCT t_stars.idStar, t_stars.nom_star FROM $from ORDER BY t_stars.nom_star;";
       $xml->addChild('metiers1', filtrage($sql));
       $data = array();
    }
     
     
    // données de la table
    $sql = <<<SQL
    SELECT
    t_sexe.sexe,
    t_age.age_,
    t_metier.metier,
    t_stars.nom_star,
    t_age_metier.nbApparition,
    t_age_metier.image,
    t_age_metier.bio
    FROM
    $fromAndWhere
    ORDER BY
    t_sexe.sexe ASC,
    t_age.age_ DESC,
    t_metier.metier ASC,
    t_stars.nom_star ASC;
    SQL;
     
    $data = array();
    $qry = mysql_query($sql);
     
    // mise en forme des données
    // ici on reconstruit les données de la table
    while($row = mysql_fetch_assoc($qry)) {//Lit une ligne de résultat MySQL dans un tableau associatif
       $data[] = <<<HTML
     <tr>
        <td>{$row['bio']}</td>
        <td><img src='{$row['image']}' /></td></tr>
    HTML;
    }
     
    if (empty($data)) { // pas de données correspondant au filtre
       $data[] = '<tr></tr>';
    }
     
    $xml->addChild('table', implode("\n", $data)); # noeud attendu par jQuery dans filterLists()
     
     
    // Envoi du header et des données
    header('content-type: text/xml');
    echo $xml->asXML();
     
    ?>
    Merci pour vos avis

  2. #2
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par défaut
    Lors du chargement de certains XML, la console de Firefox nous donne une erreur difficile à comprendre :
    mal formé
    Le numéro de ligne renvoyé pointe sur une ligne qui, a priori, ne contient pas d’erreur. En réalité, l’erreur est à la ligne au-dessus :
    1
    2
     
     

    Ce code est celui du symbole carriage return '\r'. Il ne pose pas de problème à l’analyseur XML de Chrome, mais fait échouer celui de Firefox.

    Il semblerait que ton script filterLists.php génère des lignes contenant ce symbole dans certaines circonstances. Exemple ici :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    &lt;option value="4"&gt;Baldwin Alec
     
    &lt;/option&gt;

    Vu que certains noms d’acteur sont accompagnés d’un carriage return et d’autres pas, je suppose que ces symboles se sont glissés lors de l’insertion des données SQL. Tu vas donc devoir faire un peu de ménage dans ta base de données… Cette requête t’aidera à trouver quelles lignes sont concernées :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM t_stars
    WHERE nom_star LIKE '%\r%';
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur du Dimanche
    Inscrit en
    Juillet 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur du Dimanche
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 147
    Par défaut
    Ok salut et merci pour le coup de pouce.
    J'ai nettoyé la table seulement voilà dans la table t_age_metier, colonne 'bio' il ne s'affiche plus rien à cause des lettres accentuées (é, è...) je suis pourtant en utf-8?

  4. #4
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par défaut
    Je te conseille de lire passer à l’UTF-8 sans manquer une étape, avec deux précisions :
    1. En html 5, plus besoin de la syntaxe compliquée <meta http-equiv …>, il suffit de <meta charset="utf-8">
    2. Puisque tu vas devoir utiliser mysql_set_charset, j’en profite pour te faire remarquer que l’API mysql_* est dépréciée et que tu peux migrer vers mysqli_* pour peu d’efforts.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur du Dimanche
    Inscrit en
    Juillet 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur du Dimanche
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 147
    Par défaut
    Ok je vais me pencher la dessus pour mysqli car c'est pas la première fois que l'on me fait la remarque.
    J'ai ajouté mysql_set_charset('utf8',$cnx); après mysql_connect en attendant.
    Merci beaucoup.
    Cordialement...

Discussions similaires

  1. [AJAX] Pb de listes liées en mode Synchrone sous FireFox
    Par olive_le_malin dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/12/2006, 17h28
  2. Deux listes lies et un lien
    Par arti2004 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/03/2006, 16h44
  3. [MySQL] 1 table et 2 listes liées
    Par Ekik dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 07/02/2006, 16h47
  4. XMLHTTPRequest et listes liées
    Par ben23 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/12/2005, 16h32
  5. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo