Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > AJAX
AJAX Forum sur la programmation AJAX. Avant de poster : Cours AJAX, FAQ AJAX, Toutes les FAQ JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/01/2012, 15h47   #1
Invité de passage
 
Homme Serge
Educateur spécialisé
Inscription : janvier 2012
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Serge
Localisation : France

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

Informations forums :
Inscription : janvier 2012
Messages : 21
Points : 4
Points : 4
Par défaut 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 :
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 :
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 :
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.
Sergio_zero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2012, 20h55   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2012, 21h55   #3
Invité de passage
 
Homme Serge
Educateur spécialisé
Inscription : janvier 2012
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Serge
Localisation : France

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

Informations forums :
Inscription : janvier 2012
Messages : 21
Points : 4
Points : 4
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.
Sergio_zero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2012, 23h08   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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 :
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
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 07h45   #5
Invité de passage
 
Homme Serge
Educateur spécialisé
Inscription : janvier 2012
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Serge
Localisation : France

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

Informations forums :
Inscription : janvier 2012
Messages : 21
Points : 4
Points : 4
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 :
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 :
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 :
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 :
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 :
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 :
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.
Sergio_zero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 08h50   #6
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Postes moi plutôt le code sql des tables marques, gammes, types, cartouches
Je ne veux pas les données juste la structure.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 09h44   #7
Invité de passage
 
Homme Serge
Educateur spécialisé
Inscription : janvier 2012
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Serge
Localisation : France

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

Informations forums :
Inscription : janvier 2012
Messages : 21
Points : 4
Points : 4
Désolé je comprend pas ce que tu veux.
les tables type, marque,gamme et imprimante sont posté plus haut au début du post, je l'ai avaient créer pour faire fonctionner le code que tu m'a donné dans l'autre post (4 listes liées) sur le forum.
par contre je veux utiliser qu'un seul table la table cartouche_generique qui regroupe tous ces champs dans des colonnes.
Sergio_zero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 09h56   #8
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par Sergio_zero Voir le message
Désolé je comprend pas ce que tu veux.
les tables type, marque,gamme et imprimante sont posté plus haut au début du post, je l'ai avaient créer pour faire fonctionner le code que tu m'a donné dans l'autre post (4 listes liées) sur le forum.
Je voudrais voir la DDL de tes tables c'est le code sql qui permet de les créer, le code commençant par CREATE TABLE...
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 11h32   #9
Invité de passage
 
Homme Serge
Educateur spécialisé
Inscription : janvier 2012
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Serge
Localisation : France

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

Informations forums :
Inscription : janvier 2012
Messages : 21
Points : 4
Points : 4
Voici, désolé je n'avais pas compris
--
-- Structure de la table `cartouche_generique`
--

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE IF NOT EXISTS `cartouche_generique` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `REF_ACMX` char(50) collate latin1_general_ci NOT NULL,
  `REF_OEM` char(50) collate latin1_general_ci NOT NULL,
  `marque` char(50) collate latin1_general_ci NOT NULL,
  `TYPE` char(50) collate latin1_general_ci NOT NULL,
  `gamme` char(50) collate latin1_general_ci NOT NULL,
  `POUR_IMPRIMANTE` text collate latin1_general_ci NOT NULL,
  `NBRS_PAGES` char(50) collate latin1_general_ci NOT NULL,
  `Couleur` char(50) collate latin1_general_ci NOT NULL,
  `TARIF_1` decimal(10,2) NOT NULL,
  `TARIF_2` decimal(10,2) NOT NULL,
  `TARIF_3` decimal(10,2) NOT NULL,
  `TARIF_4` decimal(10,2) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=13247 ;
Sergio_zero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 12h00   #10
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
C'est ce que je soupçonnais, tu utilises le moteur MyISAM de MySql alors que dans ton cas il aurait été préférable d'utiliser InnoDb. Je me demande bien comment tu gères tes intégrités référentielles ? Tout est codé à la mano non ? Procédures stockées ?
Sinon, pour ta table cartouche_generique tu as des erreurs de types pour les champs suivants : marque, type et gamme. Ils devraient être en int(11) et devraient également référencer les id autonum des tables correspondantes.
Vu que tu es en MyISAM, t'es marron.
La correction n'est pas simple. Changer le type d'un champ est généralement impossible à cause des données déjà présentes dedans. Sans compter que tu as dû dupliquer les valeurs textes entre tes tables (marque, type, gamme) et leurs champs correspondants dans la table cartouche_generique. Bref, pas simple pour revenir à un schéma correcte et maintenable.
Il faudrait que tu te documentes quand même un peu plus sur les bases de données parce que là tu t'embarques dans un système qui est ou sera ingérable à très court terme.
Je te conseille de reprendre intégralement ton design après t'être documenté et avoir pratiqué quelques cas d'école.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 13h51   #11
Invité de passage
 
Homme Serge
Educateur spécialisé
Inscription : janvier 2012
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Serge
Localisation : France

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

Informations forums :
Inscription : janvier 2012
Messages : 21
Points : 4
Points : 4
Merci pour tous ces renseignement mais je pensai que int(11) était à utiliser pour des nombres entier.
côté code oui tous est fait à la mano comme tu dit.
Je n'ai pas encore fait mes quatre tables, je voulais d'abord savoir si il existait un moyen de faire avec ma table actuelle cartouche_generique car jusqu’à présent mon système fonctionne avec quatre select qui passe leur valeur en valident le choix les uns après les autres (en php).
Dans le second je récupère la valeur du premier, dans le troisième je récupère la valeur du premier et du second pour faire ma requête (WHERE type=$type AND marque=$marque) et dans le quatrième je récupère la valeur du premier du second et du troisième (WHERE type=$type AND marque=$marque AND gamme=$gamme)
J'aurais voulu faire la même chose mais avec des listes liées.
pourtant il me semble que si j'arrive à récupérer toutes les valeurs des select au fur et à mesure c'est faisable.
Sergio_zero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 14h27   #12
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
essaies avec ça pour refreshGammes.php :
Code :
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
<?php
 
if (isset($_POST['marque']) && $_POST['marque'] !== '') {
   mysql_connect("***","***","***");
   mysql_select_db("***");
 
   $where   = array();
   $where[] = "marque = '" . mysql_real_escape_string($_POST['marque']) . "'";
 
   if (isset($_POST['type']) && $_POST['type'] !== '') {
      $where[] = "type = '" . mysql_real_escape_string($_POST['type']) . "'";
   }
 
   $sql  = "SELECT DISTINCT gamme FROM cartouche_generique WHERE " . implode(' AND ', $where) . " ORDER BY gamme";
   $data = mysql_query($sql);
 
   $options   = array();
   $options[] = '<option value="">-- Sélectionnez --</option>';
 
   while($row = mysql_fetch_assoc($data)) {
      $value     = htmlspecialchars($row["gamme"], ENT_QUOTES);
      $options[] = '<option value="'.$value.'">'.$value.'</option>';
   }
}
header("Content-Type: text/html");
echo implode("\n", $options);
 
?>
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 14h47   #13
Invité de passage
 
Homme Serge
Educateur spécialisé
Inscription : janvier 2012
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Serge
Localisation : France

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

Informations forums :
Inscription : janvier 2012
Messages : 21
Points : 4
Points : 4
Il me semble avoir déjà essayer if (isset($_POST['type']) pour pouvoir récupérer la valeur et l'utiliser dans ma requête mais sans succès car le $_POST['type'] n'a pas l'air d’exister.
Je réessayerais ce soir on ne sais jamais, la je suis au boulot.
Par contre je comprend pas pourquoi tu fait un tableau associatif
$where = array(); ce n'est pas se compliquer pour rien ?
Sergio_zero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 19h35   #14
Invité de passage
 
Homme Serge
Educateur spécialisé
Inscription : janvier 2012
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Serge
Localisation : France

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

Informations forums :
Inscription : janvier 2012
Messages : 21
Points : 4
Points : 4
J'ai modifié ma page refreshGammes.php comme tu me la dit mais ça affiche toutes les gammes et pas uniquement la gamme qui correspond au type et à la marque sélectionné dans le deux premier select (type et marque).
Désolé je vient de comprendre pourquoi tu me dit de mettre int(11), mes champs marque, type et gamme ne sont pas des nombres mais des champs de texte.
Voici le contenu de ma table cartouche_generique (enfin une partie car elle fait 13000 lignes)
--
-- Structure de la table `cartouche_generique`
--

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE IF NOT EXISTS `cartouche_generique` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `REF_ACMX` char(50) collate latin1_general_ci NOT NULL,
  `REF_OEM` char(50) collate latin1_general_ci NOT NULL,
  `marque` char(50) collate latin1_general_ci NOT NULL,
  `TYPE` char(50) collate latin1_general_ci NOT NULL,
  `gamme` char(50) collate latin1_general_ci NOT NULL,
  `POUR_IMPRIMANTE` text collate latin1_general_ci NOT NULL,
  `NBRS_PAGES` char(50) collate latin1_general_ci NOT NULL,
  `Couleur` char(50) collate latin1_general_ci NOT NULL,
  `TARIF_1` decimal(10,2) NOT NULL,
  `TARIF_2` decimal(10,2) NOT NULL,
  `TARIF_3` decimal(10,2) NOT NULL,
  `TARIF_4` decimal(10,2) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=13247 ;
--
-- Contenu de la table `cartouche_generique`
--

Code sql :
1
2
3
4
5
6
INSERT INTO `cartouche_generique` (`id`, `REF_ACMX`, `REF_OEM`, `marque`, `TYPE`, `gamme`, `POUR_IMPRIMANTE`, `NBRS_PAGES`, `Couleur`, `TARIF_1`, `TARIF_2`, `TARIF_3`, `TARIF_4`) VALUES
(1, 'AG120-A420', 'NEUTRE', 'NEUTRE', 'PAPIER PHOTO', 'A4', 'PHOTO BRILLANT ADHESIF A4 (210mmx297mm) 120grs 20 pages', '120 GRS - 5760 dpi', 'BLANC ADHESIF BRILLANT', 3.00, 2.80, 2.70, 2.50),
(2, 'AG125-A620', 'NEUTRE', 'NEUTRE', 'PAPIER PHOTO', 'A6', 'PHOTO BRILLANT ADHESIF A6 (105mmx148mm) 125grs 20 pages', '125 GRS - 5760 dpi', 'BLANC ADHESIF BRILLANT', 1.00, 0.90, 0.80, 0.70),
(3, 'BJ21B', 'LC-600BK / LC-21BK', 'BROTHER', 'JET D''ENCRE GENERIQUE', 'IntelliFax', 'BROTHER IntelliFax 1800', '25ml', 'NOIRE', 1.30, 1.20, 1.10, 1.00),
(4, 'BJ21B', 'LC-600BK / LC-21BK', 'BROTHER', 'JET D''ENCRE GENERIQUE', 'MFC', 'BROTHER MFC-3100C', '25ml', 'NOIRE', 1.30, 1.20, 1.10, 1.00),
(5, 'BJ21B', 'LC-600BK / LC-21BK', 'BROTHER', 'JET D''ENCRE GENERIQUE', 'MFC', 'BROTHER MFC-3200J', '25ml', 'NOIRE', 1.30, 1.20, 1.20, 1.20),
Voila dit moi si tu vois des erreurs de types dans ma table.
Je vais reprendre depuis le début car je pense que je me suis mal fait comprendre et on part dans tous les sens.
Je voudrai faire fonctionner 4 listes liées qui iraient chercher les informations dans une seule table (la table cartouche_generique ci-dessus)
Je remet mon code
Tout d'abord la page cartouche_generique
Dans le head
Code :
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>
Puis dans le body
Code :
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
connexionbdd();
		$exec = mysql_query("SELECT DISTINCT TYPE FROM cartouche_generique ORDER BY TYPE") or die(mysql_error());
		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>
Ensuite les pages qui sont appelées par AJAX
refreshMarques.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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");
?>
refreshGammes.php
Code :
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 :
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("62.193.208.224","acmx","Acmx13");
		mysql_select_db("acmx");
		$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");
?>
Voila je pense que si j'arrive à récupérer la valeur des deux premier select (type et marque) pour mettre dans ma requête pour rechercher la gamme du style :
Code :
1
2
3
$selection_recherche = mysql_query("SELECT * FROM cartouche_generique 
								WHERE TYPE='".$_SESSION['type']."' AND marque='".$_SESSION['marque']."' AND gamme='".$_SESSION['gamme']."' ORDER BY gamme");
								$queries++;
Et si j'arrive à récupérer la valeur des trois premier select (type,marque et gamme) pour faire la recherche pour remplir le dernier select imprimante du style
Code :
1
2
3
$selection_recherche = mysql_query("SELECT * FROM cartouche_generique 
								WHERE TYPE='".$_SESSION['type']."' AND marque='".$_SESSION['marque']."' AND gamme='".$_SESSION['gamme']."' AND POUR_IMPRIMANTE='".$_SESSION['imprimante']."' ORDER BY imprimante");
								$queries++;
c'est gagné.
Merci encore.
Sergio_zero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 09h36   #15
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Voilà comment récupérer les valeurs de marque et de type pour mettre à jour les gammes :
Code :
1
2
3
4
5
6
7
8
9
function refreshGammes() {
   var listMarques = document.getElementById('marques');
   var idMarque = listMarques.options[listMarques.selectedIndex].value;
   var listTypes = document.getElementById('types');
   var idType = listTypes.options[listTypes.selectedIndex].value;
   if ((idMarque != '') && (idType != '')) {
      callAndRefresh('gammes', '<?php echo ROOTPATH; ?>/insert/refreshGammes.php', 'marque='+idMarque+'&type='+idType);
   }
}
Procèdes par analogie pour le reste.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 09h47   #16
Invité de passage
 
Homme Serge
Educateur spécialisé
Inscription : janvier 2012
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Serge
Localisation : France

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

Informations forums :
Inscription : janvier 2012
Messages : 21
Points : 4
Points : 4
Oh merci, je croix que la ce sera bon.
Il me tarde ce soir pour tester ça.
Je teste ce soir et EDIT.

EDIT :
Merci beaucoup rawsrc tous fonctionne comme je le voulais.
Merci et bravo.
Sergio_zero est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h37.


 
 
 
 
Partenaires

Hébergement Web