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

AJAX Discussion :

[AJAX] Listes liées et table dans bdd


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut [AJAX] Listes liées et table dans bdd
    Bonjour à tous.
    J'aurais besoin d'un peu d'aide concernant 4 listes liées et 4 tables dans ma bdd.
    Je voudrai savoir si au lieu d'avoir 4 table liée entre elles par id je pouvais en avoir qu'une seul ou je trierais les infos avec un DISTINCT lors de la requête pour récupérer les infos.
    Voici les tables et les listes associées je pense que ce sera plus claire.
    1èr liste qui affiche le type de cartouche d'encre et qui récupère l'id en value :
    table type_generique
    INSERT INTO `type_generique` (`id`, `type`) VALUES
    (1, 'Cartouche jet d''encre'),
    (2, 'Kit de recharge'),
    (3, 'Cartouche laser'),
    (4, 'Cartouche de nettoyage'),
    (5, 'Papier'),
    (6, 'Ruban de transfert');

    L'id du type est envoyé à la liste des marques et affiche les marques qui correspondes la colonne id_cor_type
    table marques_generique
    INSERT INTO `marques_generique` (`id_mar`, `marque`, `id_cor_type`, `id_marque`) VALUES
    (1, 'BROTHER', 4, 1),
    (2, 'APPLE', 4, 2),
    (3, 'EPSON', 4, 3),
    (4, 'BROTHER', 1, 4),
    (5, 'CANON', 1, 5),
    (6, 'APPLE', 1, 6),
    (7, 'ALCATEL', 1, 7),
    (8, 'SIEMENS', 1, 8),
    (9, 'HEWLETT PACKARD', 1, 9),
    (10, 'LEXMARK', 1, 10),
    (11, 'UTAX', 1, 11),
    (12, 'BROTHER', 3, 12),
    (13, 'MINOLTA', 3, 13),
    (14, 'LEXMARK', 3, 14),
    (15, 'DELL', 3, 15),
    (16, 'IBM', 3, 16),
    (17, 'OKI', 3, 17),
    (18, 'SAMSUNG', 3, 18),
    (19, 'BROTHER', 3, 19),
    (20, 'BROTHER', 6, 20),
    (21, 'EPSON CANON BROTHER HEWLETT PACKARD LEXMARK XEROX', 2, 21),
    (22, 'PAPIER', 5, 22);

    L'id_marque de la marque est envoyé à la liste des gammes et affiche les gammes qui correspondes la colonne id_cor_marque de la table gammes_generique
    table gammes_generique
    INSERT INTO `gammes_generique` (`id_gen`, `GAMME`, `id_cor_marque`, `id_gamme`) VALUES
    (1, 'PCRF', 4, 1),
    (2, 'BJ', 4, 2),
    (3, 'DCP', 4, 3),
    (4, 'Fax', 4, 4),
    (5, 'HJ', 4, 5),
    (6, 'IntelliFax', 4, 6),
    (7, 'MFC', 4, 7),
    (8, 'MFC-J', 4, 8),
    (9, 'P', 4, 9),
    (10, 'QBJ', 4, 10),
    (11, 'DCP', 12, 11),
    (12, 'HL', 12, 12),
    (13, 'MFC', 12, 13),
    (14, 'DCP', 1, 14),
    (15, 'Fax', 1, 15),
    (16, 'MFC', 1, 16),
    (17, 'Fax', 20, 17),
    (18, 'Fax T', 20, 18),
    (19, 'MFC', 20, 19);

    et pour finir ma table principale affiche les valeurs qui corresponde à id_gamme.
    Je pense que la c'est plus claire

    Ce que je voudrai c'est faire tous ça avec une seule table car c'est la folie de mettre tous ces numéro d'id.
    J'ai donc essayé de faire ma requête avec un DISTINCT mais le problème c'est de pouvoir récupérer les valeurs des différente liste.
    Je m'explique.
    Voici la liste qui récupère le type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <select id="types" name="type" onchange="refreshMarques();">
    	<option value="">-- Sélectionnez --</option>
    	<?php while($data = mysql_fetch_assoc($exec)): ?>
    	<option value="<?php echo ''.$data['TYPE'].''; ?>"><?php echo $data['TYPE']; ?></option>
    	<?php endwhile; ?>
    </select>
    et le js associé :
    function refreshMarques() {
    var listTypes = document.getElementById('types');
    var idType = listTypes.options[listTypes.selectedIndex].value;
     if (idType != '') {
    callAndRefresh('marques', '<?php echo ROOTPATH; ?>/insert/refreshMarques.php', 'type='+idType);
         }
    }
    La page refreshMarques.php est bien appelée et elle affiche la seconde liste, celle de la marque.
    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
    page refreshMarques.php
    if (isset($_POST['type'])  && $_POST['type'] !='')
    	{
    		$_SESSION['type'] = htmlspecialchars($_POST['type']);
    		mysql_connect("***","***","***");
    		mysql_select_db("***");
    		$query = mysql_query("SELECT DISTINCT marque FROM cartouche_generique WHERE TYPE='".$_SESSION['type']."' ORDER BY marque");?>
    		<option value="">-- Sélectionnez --</option>
    		<?php
    		while ($back = mysql_fetch_assoc($query))
    			{
    				echo '<option value="'.$back["marque"].'">'.$back["marque"].'</option>';
    			}
    	}
    header("Content-Type: text/html"); 
    et le js associé
    function refreshGammes() {
                       var listMarques = document.getElementById('marques');
                       var idMarque = listMarques.options[listMarques.selectedIndex].value;
                       if (idMarque > 0) {
                          callAndRefresh('gammes', '<?php echo ROOTPATH; ?>/insert/refreshGammes.php', 'marque='+idMarque);
                       }
                    }
    Jusque là tous va bien.
    Le souci est ici lors de la sélection de la marque, je voudrai que la liste gamme affiche que les gammes qui corresponde au type et à la marque choisi mais je ne sais pas comment faire pour récupérer ces valeurs.
    Voici la page refreshGammes.php
    J'ai essayé ça mais ça fonctionne pas, rien n'est affiché.
    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
    <?php
    // Ajax : Liste des marques après sélection d'un type
    if (isset($_POST['marque']) && $_POST['marque'] != '')
    	{
    		//$idMarque = htmlspecialchars($_POST['marque']);
    		$_SESSION['marque'] = htmlspecialchars($_POST['marque']);
    	   // recuperation de id_liste1
    		mysql_connect("***","***","***");
    		mysql_select_db("***");
    		$query = mysql_query("SELECT DISTINCT gamme FROM cartouche_generique WHERE TYPE='".$_SESSION['type']."' AND marque='".$_SESSION['marque']."' ORDER BY gamme");?>
    		<option value="">-- Sélectionnez --</option>
    		<?php
                    while ($back = mysql_fetch_assoc($query))
                            {
                                    echo '<option value="'.$back["gamme"].'">'.$back["gamme"].'</option>';
                            }
            }
    header("Content-Type: text/html");
    ?>
    par contre si je met cette requête
    $query = mysql_query("SELECT DISTINCT gamme FROM cartouche_generique WHERE TYPE='".$_SESSION['type']."' AND marque='".$_SESSION['marque']."' ORDER BY gamme");?>
    ça fonctionne mais ça m'affiche toutes les gammes et pas celle qui corresponde au type et à la marque.
    Idem pour la quatrième liste.
    J'espère avoir été assai claire dans mes explications.
    Un grand merci à tous ceux qui pourrons m'aider.

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    Euh, c'est pas très clair tout ça.
    Déjà pour commencer tu devrais te faire un formulaire de saisie en bonne et due forme avec des listes et tout ce qu'il faut pour que l'alimentation de ta base soit confortable. Par ailleurs, ce formulaire pourra te servir pour gérer aussi les modifications.
    Je serais toi, je ne gérerai pas la gamme. C'est inutile à mon sens. Le modèle de l'imprimante suffit amplement : MFC-7420 ou MP-810...
    Pas la peine de s'embêter plus.

  3. #3
    Membre éclairé
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut
    Bonsoir.
    j'ai besoin du select gamme car il y a plusieurs gamme disponible pour une même marque de même type.
    Je sais que ce n'est pas très claire mais c'est pas facile à expliquer.
    il faudrait en gros que mes quatre select recherche et affiche les informations qui sont dans une seule table plutôt que quatre.
    il faudrait pour ça que je récupère la valeur de la liste une et deux pour faire la requête de mon troisième select.

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bon si tu veux, mais je pense que c'est pas gagné.
    Déjà je ne comprends pas trop tes champs de table...
    Pour arriver à faire ce que tu veux il faut faire une jointure entre les tables :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT 
       gamme
    FROM
       gammes_generique gg
          INNER JOIN marques_generique mg ON gg.id_cor_marque = mg.id_mar
    WHERE
       mg.id_cor_type = $type
       AND mg.id_mar = $marque

    Enfin, là c'est le b.a.ba de la base de données, il faudrait que tu bouquines un peu parce que tu vas perdre patience en moins de temps qu'il ne faut pour l'écrire.

    Tu n'échappes pas tes valeurs avec htmlspecialchars() pour la base de données, c'est soit requêtes préparées (PDO) soit mysql_real_escape_string()
    htmlspecialchars() ne sert qu'à échapper des données potentiellement dangereuses à l'affichage dans le navigateur.
    Je t'invite à passer un peu de temps ici

  5. #5
    Membre éclairé
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut
    Bonjour et merci.
    J'ai du mal m'exprimer mais justement je ne veux pas avoir plusieurs table.
    Ok pour le htmlspecialchars() je pensé que pour un simple appel c’était bon.
    Je met mes pages en dessous je pense que ce sera plus explicite.
    page cartouche_generique.php
    dans le head
    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
     
    <script type="application/javascript">
                    /* Initialisation XMLHttpRequest */
                    function getXhr(){
                       var xhr = null;
                       if(window.XMLHttpRequest) // Firefox et autres
                          xhr = new XMLHttpRequest();
                       else
                       if(window.ActiveXObject){ // Internet Explorer
                          try {
                             xhr = new ActiveXObject("Msxml2.XMLHTTP");
                          } catch (e) {
                             xhr = new ActiveXObject("Microsoft.XMLHTTP");
                          }
                       }
                       else { // XMLHttpRequest non supporté par le navigateur
                          alert ("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
                          xhr = false;
                       }
                       return xhr;
                    };
     
                    function refreshMarques() {
                       var listTypes = document.getElementById('types');
                       var idType = listTypes.options[listTypes.selectedIndex].value;
                       if (idType != '') {
                          callAndRefresh('marques', '<?php echo ROOTPATH; ?>/insert/refreshMarques.php', 'type='+idType);
                       }
                    }
     
                    function refreshGammes() {
    					var listMarques = document.getElementById('marques');
    					var idMarque = listMarques.options[listMarques.selectedIndex].value;
                       if (idMarque != '') {
                          callAndRefresh('gammes', '<?php echo ROOTPATH; ?>/insert/refreshGammes.php', 'marque='+idMarque);
                       }
                    }
     
                    function refreshImprimantes() {
                       var listGammes = document.getElementById('gammes');
                       var idGamme = listGammes.options[listGammes.selectedIndex].value;
                       if (idGamme != '') {
                          callAndRefresh('imprimantes', '<?php echo ROOTPATH; ?>/insert/refreshImprimantes.php', 'gamme='+idGamme);
                       }
                    }
     
                    function callAndRefresh(id, url, params) {
                       var xhr = getXhr();
                       xhr.onreadystatechange = function(){
                          // si on a tout reçu et que le serveur est ok
                          if(xhr.readyState == 4 && xhr.status == 200)
                          {
                             // On se sert de innerHTML pour rajouter les options a la liste des "selections"
                             document.getElementById(id).innerHTML = xhr.responseText;
                          }
                       }
                       // on defini la methode (post) + le fichier de traitement + asynchrone (true)
                       xhr.open("POST", url , true);
                       xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                       // on poste les parametres a transmettre au fichier qui fera le traitement
                       xhr.send(params);
                    } 
                     </script>
    dans le body
    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
     
    <?php
    echo'<form method="post" action="'.ROOTPATH.'/index.php?page=cartouche_generique">'; ?>
    			<fieldset>
    				<legend>Recherchez votre produit générique par sélection</legend>
    				<div class="texte_lien"><ul>
    					<li><label for="types"><strong class="espacement_texte_lien">
    					Sélectionnez le type : </strong></label>
    					<select id="types" name="type" onchange="refreshMarques();">
    					<option value="">-- Sélectionnez --</option>
    					<?php while($data = mysql_fetch_assoc($exec)): ?>
    					   <option value="<?php echo ''.$data['TYPE'].''; ?>"><?php echo $data['TYPE']; ?></option>
    					<?php endwhile; ?>
    					</select>
    					</li>
    					<li><label for="marques"><strong class="espacement_texte_lien">
    					Sélectionnez votre marque : </strong></label>
    					<select id="marques" name="marque" onchange="refreshGammes();">
    					<option value="">-- Sélectionnez le type --</option>
    					</select>
    					</li>
    					<li><label for="gammes"><strong class="espacement_texte_lien">
    					Sélectionnez la gamme : </strong></label>
    					<select id="gammes" name="gamme" onchange="refreshImprimantes();">
    					<option value="">-- Sélectionnez la marque --</option>
    					</select>
    					</li>
    					<li><label for="imprimantes"><strong class="espacement_texte_lien">
    					Sélectionnez le produit : </strong></label>
    					<select id="imprimantes" name="imprimante">
    					<option value="">-- Sélectionnez la gamme --</option>
    					</select>
    					</li>
    				</ul></div>
    			</fieldset>
    			<fieldset>
    				<legend>Ou entrez la référence OEM</legend>
    				<input type="hidden" name="selection" value="REF_OEM" />
    				<input type="hidden" name="page" value="Panier_generique_1" />
    				<input type="hidden" name="choix" value="resultats" />
    				<input type="text" size="40" name="ref_oem"/>
    				<!--<input type="submit" value="Rechercher" name="Rechercher" />-->
    			</fieldset>
    			<p class='center'>
    					<input type="submit" name="btenvoi" value="OK" />
    			</p>
    		</form>
    page refreshMarques.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
     
    <?php
    // Ajax : Liste des marques après sélection d'un type
    if (isset($_POST['type'])  && $_POST['type'] !='')
    	{
    		//$idType = htmlspecialchars($_POST['type']);
    		$_SESSION['type'] = htmlspecialchars($_POST['type']);
    	   // recuperation de id_liste1
    		mysql_connect("***","***","***");
    		mysql_select_db("***");
    		$query = mysql_query("SELECT DISTINCT marque FROM cartouche_generique WHERE TYPE='".$_SESSION['type']."' ORDER BY marque");?>
    		<option value="">-- Sélectionnez --</option>
    		<?php
                    while ($back = mysql_fetch_assoc($query))
                            {
                                    echo '<option value="'.$back["marque"].'">'.$back["marque"].'</option>';
                            }
            }
    header("Content-Type: text/html");
    ?>
    page refreshGammes.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
     
    <?php
    if (isset($_POST['type']) && $_POST['type'] != '')
    	{
    		$_SESSION['type'] = htmlspecialchars($_POST['type']);
    	}
    if (isset($_POST['marque']) && $_POST['marque'] != '')
    	{
    		//$idMarque = htmlspecialchars($_POST['marque']);
    		$_SESSION['marque'] = htmlspecialchars($_POST['marque']);
    	   // recuperation de id_liste1
    		mysql_connect("***","***","***");
    		mysql_select_db("***");
    		$query = mysql_query("SELECT DISTINCT gamme FROM cartouche_generique WHERE marque='".$_SESSION['marque']."' ORDER BY gamme");?>
    		<option value="">-- Sélectionnez --</option>
    		<?php
                    while ($back = mysql_fetch_assoc($query))
                            {
                                    echo '<option value="'.$back["gamme"].'">'.$back["gamme"].'</option>';
                            }
            }
    header("Content-Type: text/html");
    ?>
    page refreshImprimantes.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
     
    <?php
    // Ajax : Liste des marques après sélection d'un type
    if (isset($_POST['gamme']) && $_POST['gamme'] != '')
    	{
    		$_SESSION['gamme'] = htmlspecialchars($_POST['gamme']);
    	   // recuperation de id_liste1
    		mysql_connect("***","***","***");
    		mysql_select_db("***");
    		$query = mysql_query("SELECT DISTINCT POUR_IMPRIMANTE FROM cartouche_generique WHERE gamme='".$_SESSION['gamme']."' 
    		ORDER BY POUR_IMPRIMANTE");?>
    		<option value="">-- Sélectionnez --</option>
    		<?php
                    while ($back = mysql_fetch_assoc($query))
                            {
                                    echo '<option value="'.$back["POUR_IMPRIMANTE"].'">'.$back["POUR_IMPRIMANTE"].'</option>';
                            }
            }
    header("Content-Type: text/html");
    ?>
    il faudrait en faite que la requête de la page refreshGammes.php ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $query = mysql_query("SELECT DISTINCT gamme FROM cartouche_generique WHERE TYPE='".$_SESSION['type']."' AND  marque='".$_SESSION['marque']."' ORDER BY gamme");
    Sauf que si je met TYPE='".$_SESSION['type']." ça affiche plus rien comme si la session type était vide par contre tel qu'est la requête actuel ça affiche toutes les gammes.
    Pour la requête de la page refreshImprimantes.php çe sera le même problème.
    Voila j'espère que c'est plus claire comme ça et encore merci.

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Postes moi plutôt le code sql des tables marques, gammes, types, cartouches
    Je ne veux pas les données juste la structure.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 19
    Dernier message: 08/06/2010, 09h22
  2. Réponses: 6
    Dernier message: 20/07/2006, 16h15
  3. [AJAX]Listes liées multiples
    Par Schuss dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 27/06/2006, 16h31
  4. Réponses: 9
    Dernier message: 04/04/2006, 16h59
  5. Relation entre tables dans bdd différentes
    Par Mandotnet dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 29/03/2006, 08h03

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